【问题标题】:How is object lookup implemented by Map.get(obj) in the javascript v8 engine?javascript v8引擎中Map.get(obj)是如何实现对象查找的?
【发布时间】:2021-07-31 08:58:54
【问题描述】:

我很好奇 v8 的内部结构以及 Map 是如何在底层实现的。对比Maps,javascript 对象不能将对象作为键。据我了解Maps 以​​经典的哈希映射方式实现查找。一些散列函数将输入键映射到某个输出整数,该整数用作数组中的索引。然后在数组溢出时进行一些动态调整大小,并且在数组的每个 bin 中都有一些链表。可能 v8 的地图细节更复杂一些,它们涉及到一些针对小Maps 的优化?很想知道实际的实现与我上面的草图有多大不同。基于Map 在底层工作方式的假设,它如何从普通对象映射到数组中的键?我猜它会将指针地址取模到数组中?

想深入挖掘。

【问题讨论】:

标签: javascript dictionary v8 es6-map


【解决方案1】:

简答:ES6 Maps and Sets: how are object keys indexed efficiently?(小更新:四年后,随机“哈希”存储在对象上的精确方式确实得到了改进;原理保持不变。

长答案:正如 Bergi 建议的那样,阅读源代码。请注意,细节可能随时更改(这也是没有大量文档说明 当前 实现的原因之一)。

【讨论】:

  • 非常感谢@jmrk!我已尽力阅读源代码。 AFICS,JsMap 扩展了OrderedHashMapOrderedHashMap::GetHash,调用Object::GetHash -> JSReceiver::GetIdentityHash -> GetIdentityHashHelper -> BaseNameDictionary::Hash 获取随机散列,该散列存储在对象kObjectHashIndex 中的固定偏移处。 github.com/v8/v8/blob/dc712da548c7fb433caed56af9a021d964952728/… 听起来对吗?
  • 当然,除了跳过一堆细节之外,这个总结听起来很对。另一种概括它的方式是“对象的哈希存储在对象上”。
猜你喜欢
  • 2015-05-16
  • 2017-03-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 2011-10-22
  • 1970-01-01
  • 2020-08-14
  • 2020-04-06
相关资源
最近更新 更多