【问题标题】:How hashtable makes sure object keys are hashed into a unique index in JavaScripthashtable 如何确保对象键被散列到 JavaScript 中的唯一索引中
【发布时间】: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


【解决方案1】:

V8 开发人员在这里。字符串的散列不是唯一的(这就是使用散列函数的意义所在); V8 使用二次探测来处理冲突(请参阅source)。您可以在https://en.wikipedia.org/wiki/Hash_table#Collision_resolution 阅读有关各种策略的更多信息。

另外,hash = (hash &amp; hash) % max; 很傻 ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2014-10-12
    • 1970-01-01
    • 2019-11-15
    • 2018-03-14
    相关资源
    最近更新 更多