【发布时间】:2018-11-05 13:35:31
【问题描述】:
看完JDK的源码,我还是很惊讶字符串
"AaAa", "AaBB" and "BBBB" 具有相同的哈希码。
JDK的源码如下,
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;
谁能澄清一下?
【问题讨论】:
-
为什么这会让您感到惊讶?哈希码不是唯一的,相同的哈希码会有不同的字符串,而你恰好找到了三个。
-
"Aa"和"BB"具有相同的哈希码。因此,相同长度的"Aa"或"BB"序列将具有相同的哈希码。 -
@Jesper 有人可能会感到惊讶,为什么对努力避免冲突的加密哈希函数有经验。