gpt4 book ai didi

java - 如何确保 Java 中的 hashcode() 不会解析为相同的值?

转载 作者:行者123 更新时间:2023-12-01 06:34:43 25 4
gpt4 key购买 nike

我有一个类的哈希码实现,该哈希码实现与 Eclipse 生成的一致,也是所讨论的最普遍接受的做法 here

这是我的哈希码实现(此方法中使用的所有 Id 构成对象的键):

public int hashCode() {
final int prime = 31;
int hashCode = 1;
if(uId != null){
hashCode = prime * hashCode + uId.hashCode();
}
if(rId != null){
hashCode = prime * hashCode + rId.hashCode();
}
if(bId != null){
hashCode = prime * hashCode + bId.hashCode();
}
if(reId != null){
hashCode = prime * hashCode + reId.hashCode();
}
if(cId != null){
hashCode = prime * hashCode + cId.hashCode();
}
return hashCode;
}

我遇到了一个场景,我正在使用非常大的数据集进行测试,但我的集合没有预期数量的此类对象。仔细观察,以下两个数据集产生相同的哈希码:50268236873,因此一条记录被添加到集合中的最后一个记录替换,因为它们的哈希码相同。

  Existing record :
Record@2c0781cd[uId=54046,rId=10967,bId=177,reId=1728,cId=50194]

Record being inserted into the collection :
Record@20dad050[uId=53806,rId=18389,bId=177,reId=19026,cId=50194]

Both of these had the hashCode value = 50268236873

所以,问题是:

1] 这是两个不同对象的哈希码具有相同值的明显情况。那么如何确保任何数据集都不会发生这种情况呢?质数应该更大吗?

2]如果我们仔细观察实现中的hashCode变量是int数据类型,其最大值为2^31 - 1 = 2147483647,大于上述数据集计算的hashcode = 50268236873,因此存在溢出。使用 long 作为 hashCode 值的类型有什么后果吗?

谢谢
诺希布

编辑:

我正在使用 HashSet,在阅读了发布的答案后,我查找了 equals 实现,如下所示,我认为因为在 equals 中我检查两个对象的 hashCode 是否相同,并使用它来确定如果它们是相同的对象就会导致这个问题。

你们中有人能证实这一点吗?

@Override
public boolean equals(Object paramObject) {
boolean equals = false;
if (paramObject != null) {
ACRecord other = (ACRecord) paramObject;
if ((this.hashCode() == other.hashCode()) // I think this is where I am going wrong
|| (this.uId.equals(other.getUId())
&& this.rId.equals(other.getRId())
&& this.reId.equals(other.getReId())
&& this.bId.equals(other.getBId())
&& this.cId.equals(other.getCId))) {
equals = true;
}
}
return equals;
}

解决方案:我的 equals 方法实现是错误的,因为我使用 hashCode 来确定两个对象是否相等。更正 equals 方法实现解决了我的问题,即 hashset 正在替换现有记录。

最佳答案

通常,哈希码不保证唯一性。 HashMap 实现通常通过在幕后存储列表来处理冲突,但它们包含一项检查,以确保您不会将列表中的所有内容都视为匹配项,而只获取真正匹配的项。

换句话说,如果你执行map.get("foo")并且存在冲突, HashMap 将检查每个结果(未哈希)以查看它是否真正匹配“foo”。然后它只返回完全匹配的结果。

另请注意,虽然哈希码约定规定对 equals() 响应为 true 的任何两个对象都应具有相同的哈希码,但反之则不一定成立。

关于java - 如何确保 Java 中的 hashcode() 不会解析为相同的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29157343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com