在旧版本的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
答案 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()
计算中的某些字符并不昂贵,因为缓存了结果。