代码之家  ›  专栏  ›  技术社区  ›  Lance Pollard

hashtable如何确保将对象键散列到JavaScript中的唯一索引中

  •  1
  • Lance Pollard  · 技术社区  · 7 年前

    在看了一个简单的 hash table implementation 在JavaScript中,键索引计算为:

    function index(str, max) {
      var hash = 0;
      for (var i = 0; i < str.length; i++) {
        var letter = str[i];
        hash = (hash << 5) + letter.charCodeAt(0);
        hash = (hash & hash) % max;
      }
      return hash;
    }
    

    所以我想知道在v8的情况下,它如何使用类似的函数,但确保索引在对象上是唯一的。因此,如果您这样做:

    { a: 'foo', b: 'bar' }
    

    然后会变成这样:

    var i = index('a', 100000)
    // 97
    var j = index('b', 100000)
    // 98
    

    但是,如果对象上有100个或1000个或更多的关键点,似乎可能会发生碰撞。

    以v8为例,想知道哈希表如何保证它们的唯一性。

    1 回复  |  直到 7 年前
        1
  •  3
  •   jmrk    7 年前

    这里是V8开发人员。字符串的散列不是唯一的(这就是使用散列函数的意义);V8使用二次探测来处理碰撞(请参见 source ). 有关各种策略的更多信息,请访问 https://en.wikipedia.org/wiki/Hash_table#Collision_resolution .

    而且 hash = (hash & hash) % max; 很傻;-)