【问题标题】:What kind of hashing function/algorithm does javascript associative array use?javascript关联数组使用什么样的散列函数/算法?
【发布时间】:2015-08-22 02:49:44
【问题描述】:

我们了解到有许多不同的哈希算法/函数,我很好奇 javascript 使用了哪一个(v8,如果实现很重要的话)。

【问题讨论】:

  • 我觉得你最好问问js v8开发者code.google.com/p/v8
  • 不确定它是否是特定于实现的。
  • 我也不确定,但如果不是特定于实现的,我相信他们知道。

标签: javascript hashmap associative-array


【解决方案1】:

由于V8是开源的,你去源码吧:

这里是 GetHash():https://github.com/v8/v8/blob/master/src/objects.cc#L903

还有,这里有一些针对不同类型的哈希函数:https://github.com/v8/v8-git-mirror/blob/bda7fb22465fc36d99b4053f0ef60cfaa8441209/src/utils.h#L347

而且,这看起来像是字符串的核心哈希计算:https://code.google.com/p/v8/source/browse/trunk/src/objects.cc?spec=svn6&r=6#3574

uint32_t String::ComputeHashCode(unibrow::CharacterStream* buffer,
                                 int length) {
  // Large string (please note large strings cannot be an array index).
  if (length > kMaxMediumStringSize) return HashField(length, false);

  // Note: the Jenkins one-at-a-time hash function
  uint32_t hash = 0;
  while (buffer->has_more()) {
    uc32 r = buffer->GetNext();
    hash += r;
    hash += (hash << 10);
    hash ^= (hash >> 6);
  }
  hash += (hash << 3);
  hash ^= (hash >> 11);
  hash += (hash << 15);

  // Short string.
  if (length <= kMaxShortStringSize) {
    // Make hash value consistent with value returned from String::Hash.
    buffer->Rewind();
    uint32_t index;
    hash = HashField(hash, ComputeArrayIndex(buffer, &index, length));
    hash = (hash & 0x00FFFFFF) | (length << kShortLengthShift);
    return hash;
  }

  // Medium string (please note medium strings cannot be an array index).
  ASSERT(length <= kMaxMediumStringSize);
  // Make hash value consistent with value returned from String::Hash.
  hash = HashField(hash, false);
  hash = (hash & 0x0000FFFF) | (length << kMediumLengthShift);
  return hash;
}

可能值得一提的是,V8 尽可能避免使用哈希表作为对象属性,出于性能原因,更喜欢将已知属性引用编译为直接索引引用而不是运行时哈希查找(尽管这只是有时可能 - 取决于代码)。

【讨论】:

猜你喜欢
  • 2012-06-28
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 2014-10-02
  • 2012-06-10
相关资源
最近更新 更多