3

Park-Miller-Carta LCG や Mersenne-ツイスター。

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

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

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

より良い代替案があれば教えてください。

4

3 に答える 3

3

SHA-2を使用する

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

于 2009-03-24T15:57:28.490 に答える
1

32 ビット値を生成している場合は、従来の CRC32 の使用を検討してください。FNV は CRC の高速な代替手段であると考えられており、パフォーマンスは問題ではないと言っています。

于 2009-03-24T16:01:06.937 に答える
1

暗号的に強力なハッシュには、必要なプロパティがありますが、より多くのビットが生成されますが、結果を単純に 32 ビットに切り詰めれば問題ありません。暗号強度は実際の要件ではないので、MD5 のような欠陥のある (しかし広く使用されている) ハッシュ スキームで十分であり、多くのライブラリですぐに利用できると思います。

于 2009-03-24T16:36:36.850 に答える