ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-02 14:23:00  阅读:239  来源: 互联网

标签:javascript hashtable data-structures hash 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的数组中索引?

解决方法:

使用the remainder/modulo operator %将随机生成的值包装在特定范围内.

如果你有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;
    }
  }
}

标签:javascript,hashtable,data-structures,hash,bloom-filter
来源: https://codeday.me/bug/20190702/1356874.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有