2009-03-24 8 views
3

私は、Park-Miller-Carta LCGや、Park-Miller-Carta LCGなどのprngを出力する目的で、utf8文字列のダイジェストとして31/32ビットの符号付き/符号なし整数を生成するハッシングアルゴリズムを探しています。メルセンヌ・ツイスター。文字列でprngをシードするための良いハッシュアルゴリズムは何ですか?

私はFNV1とFNV1aを調べましたが、最後の文字が異なる類似した文字列に対して非常に近い値を提供しています。私は入力文字列の最小限の変更で根本的に変化する低衝突ハッシュを持っていたいと思います。パフォーマンスは問題ではありません。

私の現在のアプローチは、乗数として、文字コードと素数を使用して汚れたLCGで構成されています

a = 524287; 
for (i = 0; i < n; i ++) 
a = (a * string.charCodeAt (i) * 16807 + 524287) % 2147483647; 

私は任意のより良い代替手段を教えてください。

答えて

1

32ビット値を生成する場合は、従来のCRC32の使用を検討してください。 FNVはCRCに代わる高速な手段であると提唱されていますが、パフォーマンスは問題ではありません。

3

使用SHA-2

それはそこに最高/最新のハッシュアルゴリズムです。常に標準的なアルゴリズムを使用することをお勧めします。

1

暗号化された強力なハッシュは、必要なプロパティを持ちますが、より多くのビットを生成しますが、結果を32ビットに単純に切り捨てると問題ありません。 MD5のような欠陥のある(広く使われている)ハッシュスキームが適切であり、多くのライブラリで容易に利用できるように、暗号強度は実際の要件ではないと私は推測しています。