当前位置: 首页 > 面试题库 >

hashCode唯一性

楚举
2023-03-14
问题内容

的两个实例是否可能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



 类似资料:
  • 问题内容: 我需要一个Java实现,它忽略类中字段的顺序。首先,节点可以是第二个节点,第二个可以是节点优先。 这是我的方法取决于顺序: 有没有一种方法可以计算出以下边缘相同但唯一的哈希值? 应该是。 问题答案: 您可以使用某种交换运算来代替现在的运算,例如加法: 我建议您仍然使用乘数,因为它为哈希码提供了一些熵。在这里查看我的回答: 遵循一些良好的哈希规则是: 混淆您的运营商。通过混合您的运算符,

  • 问题内容: 当Java中的类未覆盖 hashCode()时 ,打印此类的实例将提供一个不错的唯一数字。 Object的Javadoc谈到了 hashCode() : 在合理可行的范围内,由Object类定义的hashCode方法确实为不同的对象返回不同的整数。 但是,当类重写 hashCode()时 ,如何获得其唯一编号? 问题答案: System.identityHashCode(yourObj

  • 比方说,我有一个班,学生。每个学生对象都有一个唯一的字段(int ID)和其他公共字段(如String schoolName等)。 现在只考虑字段ID生成hashcode()和equals()可以吗?

  • 这是我的限制: 该查询证明约束实际上不起作用: 下面是输出: 为什么唯一性没有被强制执行?

  • 对于任何实例,一旦编写了,就唯一地确定了。假设您有和,它们都遵守法律。然后 但是这样使用法则感觉像是一种欺骗。有没有一种方法可以避免这种情况而不诉诸于参数性呢?

  • 以下两者之间有区别吗: 以及: 在这两种情况下,名称是否唯一?索引唯一时意味着什么? 编辑:Postgres是唯一的约束,而索引没有回答我的问题。它考虑了FK的情况。我的问题与FK无关。我只想知道在这个例子中,这两个操作是否等价,其中不涉及FK。