2

ほとんどのアプリケーション、特にデータベースは、文字列比較よりもはるかに高速に小さな整数または浮動小数でソートおよびフィルタリングできます。

したがって、文字列ではなく整数で比較できるように、短い文字列 (約 5 ~ 40 文字) の 32 ビットまたは 64 ビットの数値を返すために使用できるハッシュ関数があるかどうか疑問に思っています。

私は最初にcrc32について考えましたが、数が少なすぎて、50,000未満のハッシュで衝突が発生する可能性があるようです(100万を超える必要があります)。

主に Python、PHP、V8 Javascript、PostgreSQL、および MySQL に興味があります。

4

1 に答える 1

2

50k エントリで衝突が起こりやすくなるという問題は、すべての 32 ビット ハッシュに固有のものです。誕生日の問題について少し読んでみると、たとえば32 ビット ハッシュなど、周りにsqrt(HashSpace)要素がある場合に衝突が発生しやすくなることがわかります。sqrt(2^32) = 64k


64 ビット ハッシュでは、衝突は非常にまれになります。しかし、私は自分のプログラムの正しさをそれに賭けることをまだあまり快適に感じていません.

ウィキペディアからの近似を使用:

100 万要素で 3*10 -8、1000万要素で 3*10-6の確率が得られます。

そのためにCRC64を使用できます。または、md5 や sha1 などの暗号ハッシュを必要な長さに切り捨てます。


悪意のある人物が文字列を選択し、故意に衝突を起こしてプログラムを破壊できる場合は、少なくとも HMAC などのキー付きハッシュに切り替える必要があります。


何をしているかによっては、string と int の間のインメモリ マッピングを作成し、遭遇した要素ごとにカウンターをインクリメントすることもできます。これにより、衝突のリスクのない完全なマッピングが得られますが、一部のシナリオでのみ適用できます。

于 2012-03-16T20:20:55.467 に答える