【问题标题】:How v8 hashes the keys in a hash tablev8 如何对哈希表中的键进行哈希处理
【发布时间】:2018-06-18 00:43:51
【问题描述】:

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

查看v8 source 很有帮助,但我有点过头了。

【问题讨论】:

    标签: 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”)每个字符串的“运行哈希”。这样攻击者无法预测哪些字符串可能具有碰撞哈希.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多