在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作为一个实际例子。
答案 0 :(得分:3)
V8开发者在这里。字符串的散列不是唯一的(这是使用散列函数的一种方式); V8使用二次探测来处理碰撞(参见source)。您可以在https://en.wikipedia.org/wiki/Hash_table#Collision_resolution了解有关各种策略的更多信息。
此外,hash = (hash & hash) % max;
非常愚蠢; - )