gpt4 book ai didi

java - 不同的map有相同的hashcode

转载 作者:行者123 更新时间:2023-12-02 09:14:27 24 4
gpt4 key购买 nike

我有两个不同 Map,但它们具有相同的哈希代码值:

    Map<String,Boolean> map1=new HashMap<>();
map1.put("a", false);
map1.put("b", true);
map1.put("c", true);
map1.put("d", true);
map1.put("e", true);
map1.put("f", false);
map1.put("g", true);
map1.put("k", false);
Map<String,Boolean> map2=new HashMap<>();
map2.put("a", false);
map2.put("b", false);
map2.put("c", false);
map2.put("d", false);
map2.put("e", true);
map2.put("f", true);
map2.put("g", false);
map2.put("k", true);

System.out.println(map1.hashCode()); //9595
System.out.println(map2.hashCode()); //9595 --> should be different as the values are different!

hashcode 函数的行为对我来说完全没问题:如果映射发生变化,那么哈希码当然也应该改变。如果映射中的值相同,则哈希码应该相同。然而,标准哈希显然会导致相似对象的冲突如何计算这两个 map 的哈希值?

我尝试使用 org.apache.commons 中的 HashCodeBuilder

System.out.println(new HashCodeBuilder(17, 31)
.append(map1.values())
.toHashCode());

System.out.println(new HashCodeBuilder(17, 31)
.append(map2.values())
.toHashCode());

System.out.println(new HashCodeBuilder(17, 31)
.append(map4.values()) //identical values as map2
.toHashCode());

这会为map1、map2 和map4(与map2 具有相同的值)返回不同的哈希值。但是,具有相同值的映射的哈希值应该是相同的......

最佳答案

The behavior of the hashcode function is perfectly fine for me: if the map changes then, of course, the hashcode should change.

强调应该改变,而不是必须。对于 hashCode 的唯一要求是,如果值相等,则哈希值必须相等。它没有给出关于如果值不同会发生什么的任何要求。它建议哈希值应该不同,但这只是一个建议,实践中很多情况下 hashCode 无法遵循该建议。

你的方法有缺陷。您不得对不同值的哈希值做出任何假设,尤其是它们是不同的。

如果存在哈希冲突,例如在基于哈希的集合中,则必须使用 equals 作为第二步来检查它是否实际上是相同的元素或只是两个不同元素的冲突元素。

来自documentation Object#hashCode:

It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

<小时/>

这当然有技术原因。散列是用相当小的东西来表示可能非常大的东西。

在这种特殊情况下,用单个int 表示任何Object。只有 2^32 不同的整数值,但有无数种不同的 Map 设置。因此,它们不可能有不同的 int 哈希值。

有关此主题的更多信息,请访问 Wikipedia#Hash function .

关于java - 不同的map有相同的hashcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59119081/

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