Cin*_*kyn 4 java string hashcode hash-collision
我有短String
s(少于10个字符).我将其转换为int
并将其用作主键.(由于小问题,我不能使用String主键.)我知道无限长度的字符串的哈希码可以冲突,但是短字符串也可以冲突吗?
nne*_*neo 11
绝对是的.例如,Ea
并且FB
是冲突的字符串,每个字符串的长度只有两个!例:
public static final void main(String[] args) {
System.out.println("Ea".hashCode() + " " + "FB".hashCode());
}
Run Code Online (Sandbox Code Playgroud)
打印2236 2236
.
Java String#hashCode
函数实际上并不接近随机.为短字符串生成冲突真的很容易,而且对于长字符串来说它不会好得多.
一般来说,即使你只坚持每个字符6位(ASCII字母和数字,以及几个符号),你只需要超过32位哈希码的可能值,只有6个字符的字符串 - 是的,你绝对可以保证2 ^ 36 6个字符的6位字符串之间的冲突.
哈希码的大小为 32 位。
char
Java 中的A大小为 16 位。
所以理论上,所有 2 个字符的字符串都可以有不同的哈希码,尽管其中一些哈希码必须与空字符串和单字符字符串的哈希码发生冲突。因此,即使采用“所有两个字符或更短的字符串”也会发生冲突。通过你有时间的10个字符,有办法更可能的字符串比可用的散列码。
碰撞仍然可能很少见,但您应该始终假设它们可能发生。