Tag: hash code uniqueness

Java哈希码在一种情况下发生冲突而在另一种情况下不会发生碰撞,为什么? (以下代码)

我尝试编写一个小程序来演示java中的哈希冲突,只重写了equals而不是hashcode()方法。 这是为了certificate两个不等对象可以具有相同哈希码的理论。 这是针对行为问题的面试问题。 我创建了200,000个对象,将它们存储在一个数组中,然后将它们进行比较以查看哪些是重复的。 (为此我在对象创建阶段之后使用嵌套for循环迭代对象数组。)对于大约200,000个对象,我得到9次碰撞。 第一个是索引196和121949处的对象。然后我继续打印这些哈希码以显示两个值是相同的。 但是我得到了一些非常令人惊讶的行为。 如果我遍历嵌套的for循环并打印哈希码的第一次碰撞,我得到相同的哈希码值 1867750575 1867750575 对于索引196和121949处的两个对象。 但是如果我注释掉嵌套for循环以检测所有冲突并直接打印索引196和121949的元素的哈希码,我得到 1829164700 366712642 注意,我没有评论这些元素的创建,只是我检查碰撞的部分。 为什么会发生这种情况,即使我不迭代它们,哈希码是不是应该一致? 附录1:据我所知,有没有一个消息来源,按照生日原则,如果我创建200,000个对象,我必须得到一个碰撞,如何迭代每个hascode或不改变任何东西? 附录2:我尝试添加另一个200000大小的数组,只是为了查看碰撞索引是否发生了变化,但是没有,所以显然在未提交循环的情况下对二进制文件进行更改不会进行任何更改。 因此,更改二进制更改哈希码的假设并不成立。 这是我的代码 import java.util.HashMap; public class EmployeeFactory { private static int counter = 0; public int id; public String empName; EmployeeFactory() { id = counter; empName = “employee_” + id; counter++; } @Override public boolean equals(Object o) […]