短字符串的哈希码可以相同吗?

时间:2014-09-12 01:05:46

标签: java string hashcode hash-collision

我有短String个(少于10个字符)。我将其转换为int并将其用作主键。 (因为小问题,我不能使用String主键。)我知道无限长度的字符串的哈希码可以冲突,但是短字符串也会发生冲突吗?

2 个答案:

答案 0 :(得分:11)

绝对是。例如,EaFB是碰撞字符串,每个字符串只有两个字符!例如:

public static final void main(String[] args) {
    System.out.println("Ea".hashCode() + " " + "FB".hashCode());
}

打印2236 2236


Java String#hashCode函数实际上并不接近随机。为短字符串生成冲突真的很容易,而且对于长字符串来说它不会好得多。

一般来说,即使你只坚持每个字符6位(ASCII字母和数字,以及几个符号),你只需要超过32位哈希码的可能值,只有6个字符的字符串 - 也就是说,你绝对可以保证2 ^ 36个6字符6位字符串之间的冲突。

答案 1 :(得分:4)

哈希码的大小为32位。

Java中的char大小为16位。

所以在理论中,所有2个字符的字符串都可能有不同的哈希码,尽管其中一些哈希码必须与空字符串和单字符字符串的哈希码冲突。因此,即使采用"两个字符或更短的所有字符串"会有碰撞。当您有 10 个字符时, way 的字符串比可用的哈希码更多。

碰撞仍然很少见,但你应该总是假设他们可以发生。