我正在学习布隆过滤器,我正在查看JavaScript中的各种哈希函数。
例如,我在另一个Stack Overflow回答中找到了这个:
在此处找到https://stackoverflow.com/a/7616484/5217568)
String.prototype.hashCode = function() {
var hash = 0, i, chr, len;
if (this.length == 0) return hash;
for (i = 0, len = this.length; i < len; i++) {
chr = this.charCodeAt(i);
hash = ((hash << 5) - hash) + chr;
hash |= 0; // Convert to 32bit integer
}
return hash;
};
如果我跑:
String.prototype.call(null, "hello")
我得到的数值为:99162322 (另外两个哈希函数让我:1335831723和120092131)。
现在,如果我创建一个假设的布隆过滤器,其中包含3个散列函数和18个索引(k = 3,m = 18),这些大值如何在索引为0-17的数组中索引?
答案 0 :(得分:2)
使用the remainder/modulo operator %
将随机生成的值包装在特定范围内。
如果你有18个元素(索引0到17),你可以获得一个<a style="padding-left: 10px; padding-right: 10px; border-left-width: 10px; border-left-style: solid; margin-left: 10px;" id="dnn_dnnUser_enhancedRegisterLink" title="ثبتنام" class="glyphicon glyphicon-user" rel="nofollow" >ثبتنام</a>
(99162322 % 18
)的索引。
如果哈希值的数量不是索引数的倍数,则结果将是有偏差的。例如,如果您的哈希值是从0到4的五个值中的一个,但是您将它映射到从0到2的三个索引,则它将偏向0(16
,0 % 3
)和1(3 % 3
或1 % 3
)超过2(仅4 % 3
)。根据您的需要,如果散列值的数量远大于索引的数量,则可以接受偏差。如果你想避免它,你需要一个方案来生成一个新的哈希输入,如果哈希结果来自偏置诱导范围。像这样:
2 % 3