快速找到 hashCode 相同的两个字符串:
查看 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;
}
其计算公式如下:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
令字符串长度为2:
设两个字符串分别为 “xy” 和 “ij”,其 hashCode 相等:
x * 31 + y = i * 31 + j
(x - i) * 31 = -y + j
取特殊情况
设 x - i = 1
得 -y + j = 31
设 x = 'B'
则 i = 'A'
设 y = 'B'
则 j = 'a'
两个字符串分别为 “BB” 和 “Aa”
String a = "BB";
String b = "Aa";
// 2112
System.out.println(a.hashCode());
System.out.println(b.hashCode());