jma*_*rje 5 javascript hash hashtable bloom-filter data-structures
我正在学习布隆过滤器,并且正在浏览 JavaScript 中的各种哈希函数。
例如,我在另一个 Stack Overflow 答案中找到了这个:
在这里找到/sf/answers/533153911/ )
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;
};
Run Code Online (Sandbox Code Playgroud)
如果我运行:
String.prototype.call(null, "hello")
Run Code Online (Sandbox Code Playgroud)
我得到的数值为:99162322(另外两个哈希函数得到了我:1335831723 和 120092131)。
现在,如果我创建一个具有 3 个哈希函数和 18 个索引(k=3,m=18)的假设布隆过滤器,这些大值如何在索引为 0-17 的数组中进行索引?
小智 2
使用余数/模运算符%将随机生成的值包装在一定范围内。
如果有 18 个元素(索引 0 到 17),则可以使用99162322 % 18( 16) 获得索引。
如果哈希值的数量不是索引数量的倍数,则结果将会有偏差。例如,如果您的哈希值是从 0 到 4 的五个值之一,但您将其映射到从 0 到 2 的三个索引,则它会偏向 0 ( , 0 % 3)3 % 3和 1 (1 % 3或4 % 3) 而不是 2 (仅2 % 3)。根据您的需要,如果哈希值的数量足够大于索引的数量,则偏差可能是可以接受的。如果您想避免这种情况,如果哈希结果来自偏差诱导范围,则需要一种方案来生成新的哈希输入。像这样的东西:
function hashIndex(string, length, hashValueCount) {
var minBiasedIndex = hashValueCount - (hashValueCount % length);
for (var i = 0; ; i++) {
var hashInput = string + ":" + String(i);
var hashResult = hash(hashInput);
if (hashResult < minBiasedIndex) {
return hashResult % length;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1423 次 |
| 最近记录: |