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

时间:2017-12-31 22:35:58

标签: javascript hashtable unique

在JavaScript中查看简单的hash table implementation后,密钥索引计算如下:

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 个答案:

答案 0 :(得分:3)

V8开发者在这里。字符串的散列不是唯一的(这是使用散列函数的一种方式); V8使用二次探测来处理碰撞(参见source)。您可以在https://en.wikipedia.org/wiki/Hash_table#Collision_resolution了解有关各种策略的更多信息。

此外,hash = (hash & hash) % max;非常愚蠢; - )