哈希码唯一性

2022-09-03 16:54:10

两个实例是否有可能具有相同的?ObjecthashCode()

从理论上讲,对象是从其内存地址派生的,因此所有内容都应该是唯一的,但是如果对象在GC期间四处移动怎么办?hashCodehashCodes


答案 1

我认为对象的hashCode方法的文档陈述了答案。

“尽管合理实用,但由Object类定义的hashCode方法确实为不同的对象返回不同的整数。(这通常是通过将对象的内部地址转换为整数来实现的,但JavaTM编程语言不需要这种实现技术。


答案 2

给定一个合理的对象集合,两个具有相同哈希代码的对象很可能是很有可能的。在最好的情况下,它成为生日问题,与数以万计的物体发生冲突。在实践中,使用相对较小的可能哈希代码池创建的对象,并且仅针对数千个对象就很容易发生冲突。

使用内存地址只是获取略微随机数的一种方法。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