v8如何散列哈希表中的键

时间:2018-01-09 01:49:44

标签: javascript data-structures hash hashtable v8

在学习how to implement a robust hash table时,我想知道算法v8用来从密钥创建哈希,以及它们用作密钥(用于字符串密钥)。关于哈希表密钥生成的大多数示例都是hello world示例,并且受到冲突攻击和其他因素的影响。我正在寻找生产系统如何实现哈希表的示例,例如v8。

查看v8 source一直很有帮助,但这有点过头了。

1 个答案:

答案 0 :(得分:1)

V8的字符串哈希实现在src / string-hasher-inl.h中,其核心部分是以下函数,它为“运行哈希”“添加”一个新字符,并在每个字符的循环中调用在字符串中:

uint32_t StringHasher::AddCharacterCore(uint32_t running_hash, uint16_t c) {
  running_hash += c;
  running_hash += (running_hash << 10);
  running_hash ^= (running_hash >> 6);
  return running_hash;
}

根据定义,每个哈希表都可能发生冲突。是否关注冲突攻击取决于应用程序(例如,服务器处理客户端输入可能希望防止基于冲突的DoS攻击;而Web浏览器通常不需要关心:如果客户端脚本想要创建无用的CPU负载,它可以简单地执行for (;;) {} - 但为什么任何脚本都想这样做?)。

防止碰撞攻击的一种可能方法是使用随机值(例如在应用程序启动时选择)而不是0来初始化(“salt”)每个字符串的“运行哈希”。这样,攻击者无法预测哪些字符串可能有碰撞哈希值