【问题标题】:How v8 hashes the keys in a hash tablev8 如何对哈希表中的键进行哈希处理
【发布时间】:2018-06-18 00:43:51
【问题描述】:
【问题讨论】:
标签:
javascript
data-structures
hash
hashtable
v8
【解决方案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”)每个字符串的“运行哈希”。这样攻击者无法预测哪些字符串可能具有碰撞哈希.