2016-12-17 6 views
0

整数のオーバーフローに依存せず、符号なしの整数に依存しない単純なハッシュ関数を探しています。符号なし整数なしで良いハッシュ関数を作るにはどうすればよいですか?

問題は、Unreal Engineの青写真(定義されていないオーバーフロービヘイビアを持つ32ビット整数のみ)と64ビット符号付き整数を使用するバージョンのPHP5でハッシュ関数を作成する必要があることです。

「共通の」シンプルなハッシュ関数を使用すると、それらはすべて符号なし整数のビットオーバーフロー動作に依存しているため、両方のプラットフォームで同じ結果が得られません。

本当に重要なのは、「ランダム性」が良いということだけです。誰かがこれを達成する簡単なことを知っていますか?

これは、サーバーにメッセージを送信するための非常に基本的な署名構文を意味します。最高のセキュリティである必要はありません...サーバ上で単純なゲームの高得点を格納するためのものです。アイデアは、私は(異なる '開始番号'を使用して)メッセージからいくつかのハッシュ整数を生成し、ハッシュ署名を作るためにそれらを追加するということです。私は、人々がネットワークメッセージを傍受しても、偽のメッセージを簡単に送信できないことをサーバーに伝えるようにするだけです。彼らは正しいハッシュ署名を彼らのメッセージと共に提供する必要があります。彼らは、使用されているハッシュ関数を知らない限り、できないはずです。彼らはゲームをリバースエンジニアリングしても、それを "ハック"することはできますが、それに対処する方法はわかりません。 私はUnrealエンジンの青写真システムで既存のハッシュ関数にアクセスすることはできません。

答えて

1

まず、符号付き整数を使用して符号なし整数の動作をシミュレートすると、積算されたハッシュ値が十分に大きくなるとモジュロ演算子が明示的に適用され、オーバーフローが発生する可能性があります。

例Cのコード(最低ハッシュ関数の謝罪が、同じ技術は、少なくとも原理的には、任意のハッシュ関数に適用可能であるべきである):

#include <stdio.h> 
#include <string.h> 

int hashFunction(const char * buf, int numBytes) 
{ 
    const int multiplier  = 33; 
    const int maxAllowedValue = 2147483648-256; // assuming 32-bit ints here 
    const int maxPreMultValue = maxAllowedValue/multiplier; 

    int hash = 536870912; // arbitrary starting number 
    for (int i=0; i<numBytes; i++) 
    { 
     hash = hash % maxPreMultValue; // make sure hash cannot overflow in the next operation! 
     hash = (hash*multiplier)+buf[i]; 
    } 
    return hash; 
} 

int main(int argc, char ** argv) 
{ 
    while(1) 
    { 
     printf("Enter a string to hash:\n"); 
     char buf[1024]; fgets(buf, sizeof(buf), stdin); 
     printf("Hash code for that string is: %i\n", hashFunction(buf, strlen(buf))); 
    } 
} 
関連する問題