如何使用哈希函数的结果来获取数组索引?

时间:2015-11-28 05:23:47

标签: javascript data-structures hash hashtable bloom-filter

我正在学习布隆过滤器,我正在查看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的数组中索引?

1 个答案:

答案 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(160 % 3 )和1(3 % 31 % 3)超过2(仅4 % 3)。根据您的需要,如果散列值的数量远大于索引的数量,则可以接受偏差。如果你想避免它,你需要一个方案来生成一个新的哈希输入,如果哈希结果来自偏置诱导范围。像这样:

2 % 3