String中hashCode方法的实现源码如下:
public int hashCode(){
int h = hash;
if(h == 0 && value.length > 0){
char val[] = value;
for(int i = 0; i < value.length; i++){
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
String类的hashCode计算方法比较简单,以31为权,每一位为字符的ASCII值进行运算,用自然溢出来等效取模。
哈希计算公式可以计为s[0]*31^(n-1)+s[1]^31(n-2)+…+s[n-1]
关于为什么取31为权,可以参考StackOverflow上的这个链接
主要因为31是一个奇质数,所以31*i=32*i-i=(i<<5)-i,这种位移与剑法结合的计算相比一般的运算快很多。