学习中how to implement a robust hash table ,我想知道 v8 用于从键创建哈希的算法,以及它们使用什么作为键(对于字符串键)。大多数关于哈希表 key 生成的示例都是 hello world 示例,并且会受到碰撞攻击和其他攻击。我正在寻找生产系统如何实现哈希表的示例,例如 v8。
浏览 v8 source很有帮助,但有点超出我的能力范围。
最佳答案
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 来初始化(“盐”)每个字符串的“运行哈希”。这样攻击者就无法预测哪些字符串可能具有冲突哈希.
关于javascript - v8 如何对哈希表中的键进行哈希处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48160436/