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

时间:2018-08-22 05:25:23

标签: javascript hash bitwise-operators

Simple (non-secure) hash function for JavaScript?Generate a Hash from string in Javascript中给出了在JS中生成哈希函数的流行答案

该代码的一个示例是:

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?还有为什么我们然后减去哈希并添加字符呢?

1 个答案:

答案 0 :(得分:2)

(hash << 5)(hash * 32),所以((hash << 5) - hash)(hash * 31)。问题答案中描述了乘以31的原因  Why does Java's hashCode() in String use 31 as a multiplier?

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