C++ から JavaScript に移植したハッシュ アルゴリズムの分布を確認するために、簡単なキャンバス ビジュアライゼーションを作成しました。
ハッシュを何に変更しても、ハッシュ関数から他のほとんどの数値よりも正確に 2 倍の頻度で 0 が選択されるという点で、0 は非常に偏っているという奇妙な動作が見られます。
デモはhttp://jsfiddle.net/x5L73/2/で見ることができます。
元の C++ アルゴリズム: http://www.azillionmonkeys.com/qed/hash.html
そして、私が参照しているコードの一部は、jsFiddle の下部にあります。
// hash is 0 twice as often as anything else
var hash = app.Hash( word ) % ( 3499 )
, b1 = 0|hash / 59
, b2 = hash % 59;
私にとって奇妙なのは、それを変更するために選択したものに関係なく、他の値の2hash
倍の頻度でゼロになることです。この例では 0回ですが、それ以外の数値はヒット回数です。これは、以下を介したブルート フォース テストによって決定されました。1/3499
1/6998
if( hash!==1234 ){ nonZero++; }else{ zero++ } // 1234 is a random number to check
if( Math.random() < .00001 ){ console.log( zero, nonZero, 0|nonZero/zero ); }
ここで何が欠けていますか???