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

Javascript 如何使用哈希函数的结果来获取数组索引?,javascript,data-structures,hash,hashtable,bloom-filter,Javascript,Data Structures,Hash,Hashtable,Bloom Filter,我正在学习bloom过滤器,并且正在研究JavaScript中的各种哈希函数 例如,我在另一个堆栈溢出答案中找到了这个: (在此处找到) 我得到的数值是:99162322 (另外两个哈希函数得到了我:1335831723和120092131) 现在,如果我创建一个具有3个散列函数和18个索引(k=3,m=18)的假设bloom筛选器,那么这些大值如何在索引为0-17的数组中进行索引?用于将随机生成的值包装在某个范围内 如果您有18个元素(索引0到17),则可以获得带有99162322%18(16

我正在学习bloom过滤器,并且正在研究JavaScript中的各种哈希函数

例如,我在另一个堆栈溢出答案中找到了这个:

(在此处找到)

我得到的数值是:99162322 (另外两个哈希函数得到了我:1335831723和120092131)

现在,如果我创建一个具有3个散列函数和18个索引(k=3,m=18)的假设bloom筛选器,那么这些大值如何在索引为0-17的数组中进行索引?

用于将随机生成的值包装在某个范围内

如果您有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;
    }
  }
}
函数hashIndex(字符串、长度、hashValueCount){
var minBiasedIndex=hashValueCount-(hashValueCount%长度);
对于(变量i=0;i++){
var hashInput=string+“:”+string(i);
var hashResult=hash(hashInput);
if(hashResult
我认为应该使用哈希函数来确定存储数据的索引。这非常有趣,谢谢。您能否帮助澄清函数中的参数。以我的问题为例,它是hashIndex(“hello”,18,17)吗?其中18是数组的长度,17是数组中的最高索引?我认为可能的散列值(hashValueCount)的数量大约是2到31的幂。我认为您的哈希函数可以返回任何无符号31位整数,尽管我可能会误解。我认为这可能太大了,因为%--oops的限制,我的minBiasedIndex计算无法工作。(另外,我最初在函数中出现了一些一个接一个的错误。我想现在已经修复了。)(是的,长度将是18,字符串将是“hello”。)考虑到可能的散列值数量远大于索引数量,我认为偏差非常小——小于0.000001%。我可能会考虑直接使用模运算符,并根据应用程序接受这种偏倚。
String.prototype.call(null, "hello") 
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;
    }
  }
}