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?还有为什么我们然后减去哈希并添加字符呢?
答案 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甚至处理器的优化)。因此,我假设代码的作者对其进行了测试,并发现它对于他的情况而言更快。