在学习how to implement a robust hash table时,我想知道算法v8用来从密钥创建哈希,以及它们用作密钥(用于字符串密钥)。关于哈希表密钥生成的大多数示例都是hello world示例,并且受到冲突攻击和其他因素的影响。我正在寻找生产系统如何实现哈希表的示例,例如v8。
查看v8 source一直很有帮助,但这有点过头了。
答案 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”)每个字符串的“运行哈希”。这样,攻击者无法预测哪些字符串可能有碰撞哈希值