在Java的String hashCode()的旧版本中跳过字符的背后的想法是什么

时间:2018-12-23 16:48:25

标签: java string hash hashcode

在旧版本的Java的String hashCode()实现中,从字符串中跳过某些字符的想法是什么

public int hashCode() {
   int hash = 0;
   int skip = Math.max(1, length()/8);
   for (int i = 0; i < length(); i += skip)
      hash = (hash * 37) + charAt(i);
   return hash;
}

在当前版本中,没有跳过,素数为31而不是37

1 个答案:

答案 0 :(得分:1)

可能加快了hashCode()的计算,但结果是它有更多潜在的冲突。
新版本支持较少的冲突,但需要更多的计算。

但是事实上,String是不可变的,因此在hashCode()的最新版本中,它是一次计算的:

public int hashCode() {
    int h = hash; 
    if (h == 0 && value.length > 0) {
        hash = h = isLatin1() ? StringLatin1.hashCode(value)
                              : StringUTF16.hashCode(value);
    }
    return h;
}

因此,从某种意义上来说,采用这种方式是有意义的,因为它减少了冲突次数,并且不跳过hashCode()计算中的某些字符并不昂贵,因为缓存了结果。