【发布时间】:2017-12-31 22:35:58
【问题描述】:
在 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 为例。
【问题讨论】:
-
不,任何哈希表实现都需要某种方式来处理冲突。如果哈希值保证是唯一的,那么它们不会有任何大小优势。
-
您无法预测字符串集的大小,因此在某些时候会发生冲突。但是,可以使用像队列这样简单的集合来处理冲突。
-
希望知道如何做到这一点,这听起来是个不错的解决方案。
-
@Bergi:其实有perfect hash这样的东西,它没有冲突,也没有浪费空间,但不适用于这种情况。
标签: javascript hashtable unique