繁体   English   中英

为什么哈希函数左移5位?

[英]Why 5 bit left shift in hashing function?

在JavaScript的简单(非安全)哈希函数中给出了在JS中生成哈希函数的流行答案 从Javascript中的字符串生成哈希

该代码的一个示例是:

String.prototype.hashCode = function() {
    var hash = 0;
    if (this.length == 0) {
        return hash;
    }
    for (var i = 0; i < this.length; i++) {
        var char = this.charCodeAt(i);
        hash = ((hash<<5)-hash)+char;
        hash = hash & hash; // Convert to 32bit integer
    }
    return hash;
}

对我来说没有意义的一行是hash = ((hash<<5)-hash)+char;

有人可以解释为什么这样做吗? 我认为我们正在对哈希值进行5 bit left shift 有什么理由为什么它是5位而不是4或6? 还有为什么我们然后减去哈希并添加字符呢?

(hash << 5)(hash * 32) ,所以((hash << 5) - hash)(hash * 31) 问题的答案描述了为什么 31乘以的原因, 为什么Java的String中的hashCode()使用31作为乘数?

因此,如果将其更改为(hash * 31) ,则结果相同。 可能(hash << 5) - hash稍微快一些,因为移位/减法可能比乘法快。 但是,如果确实如此,则取决于许多因素(是否使用了JIT编译,以及JIT甚至处理器的优化)。 因此,我假设代码的作者对其进行了测试,并发现对于他的情况来说它更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM