哈希码唯一性
两个实例是否有可能具有相同的?Object
hashCode()
从理论上讲,对象是从其内存地址派生的,因此所有内容都应该是唯一的,但是如果对象在GC期间四处移动怎么办?hashCode
hashCodes
两个实例是否有可能具有相同的?Object
hashCode()
从理论上讲,对象是从其内存地址派生的,因此所有内容都应该是唯一的,但是如果对象在GC期间四处移动怎么办?hashCode
hashCodes
我认为对象的hashCode方法的文档陈述了答案。
“尽管合理实用,但由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但JavaTM编程语言不需要这种实现技术。
给定一个合理的对象集合,两个具有相同哈希代码的对象很可能是很有可能的。在最好的情况下,它成为生日问题,与数以万计的物体发生冲突。在实践中,使用相对较小的可能哈希代码池创建的对象,并且仅针对数千个对象就很容易发生冲突。
使用内存地址只是获取略微随机数的一种方法。Sun JDK 源具有一个开关,允许使用安全随机数生成器或常量。我相信IBM(曾经?)使用快速随机数生成器,但它根本不安全。文档中对内存地址的提及似乎具有历史性质(大约十年前,具有固定位置的对象句柄并不罕见)。
以下是我几年前写的一些代码来演示冲突:
class HashClash {
public static void main(String[] args) {
final Object obj = new Object();
final int target = obj.hashCode();
Object clash;
long ct = 0;
do {
clash = new Object();
++ct;
} while (clash.hashCode() != target && ct<10L*1000*1000*1000L);
if (clash.hashCode() == target) {
System.out.println(ct+": "+obj+" - "+clash);
} else {
System.out.println("No clashes found");
}
}
}
RFE来澄清文档,因为这太频繁了:CR 6321873