hashCode唯一性

的两个实例是否可能Object具有相同的值hashCode()

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

回答:

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

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

以上是 hashCode唯一性 的全部内容, 来源链接: utcz.com/qa/427061.html

回到顶部