【问题标题】:Hash string function djb2 avoiding collisions properly?哈希字符串函数 djb2 正确避免冲突?
【发布时间】:2018-08-04 12:26:06
【问题描述】:

我正在研究 javascript 中 hasmap 的哈希字符串函数。并查看我在网上找到的这段代码,我不确定该函数是否正确:

HashMap._hashString = function(string) {
    var hash = 5381;
    for (var i=0; i<string.length; i++) {
        hash = (hash << 5) + hash + string.charCodeAt(i);
        hash = hash & hash;
    }
    //Reduce the chance of collisions by incorporating the string length,
    //and randomize the hashes to prevent malicious collisions.
    return hash ^ string.length ^ this._secret;
};

有这条线有意义吗?

        hash = hash & hash;

在这行代码中:

    return hash ^ string.length ^ this._secret;

我知道添加字符串的长度作为哈希评估的一个因素将有助于处理冲突,但为什么我要使用 XOR 操作添加这个因素?为什么不使用任何其他位运算符?

我也在阅读这篇文章,以了解更多关于哈希算法的信息:

http://www.cse.yorku.ca/~oz/hash.html

【问题讨论】:

    标签: javascript algorithm hash


    【解决方案1】:

    有这条线有意义吗?

       hash = hash & hash;
    

    该行的目的是将值限制在 32 位范围内。 hash &amp; hash 看起来像一个空操作,但应用位运算符将剪切任何溢出。它给出了与此相同的结果:

     hash = hash & 0xFFFFFFFF
    

    在这行代码中:

    return hash ^ string.length ^ this._secret;
    

    我知道添加字符串的长度作为哈希计算的一个因素将有助于处理冲突,但为什么我要使用 XOR 操作添加这个因素?为什么不使用任何其他位运算符?

    使用&amp;| 您会丢失信息:相同长度的不同输入将有更高的碰撞机会。特别是,长度为 2 的幂的 &amp; 将是灾难性的,因为它只能产生 2 个不同的值(长度本身或零)。或者 | 的长度主要为 1 位(如 0xffff):这将再次限制可能的结果。

    执行+ 是一个可行的替代方案,但您需要确保结果再次保持在 32 位范围内。

    【讨论】:

    • 尝试将值限制在 32 位范围内是否常见?
    • 可以是任意大小,但应该是固定大小的。 Wikipedia 说:“哈希函数是可用于将任意大小的数据映射到固定大小的数据的任何函数”
    猜你喜欢
    • 2011-02-04
    • 2015-05-17
    • 2017-04-15
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多