我写了一个快速的画布可视化来查看我从 C++ 移植到 JavaScript 的散列算法的分布。
我看到奇怪的行为,无论我如何修改哈希值,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;
对我来说奇怪的是,它为零的频率是任何hash
其他值的两倍,无论我选择什么来修改它。在此示例中,它是零次,而任何其他数字都是命中次数。这是通过蛮力测试确定的: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 ); }
我在这里想念什么???