如何为OR等于()的对象创建哈希码?

时间:2014-07-10 01:06:53

标签: java hash computer-science hashcode

例如,我的课看起来像下面的课程。在equals()中,我定义了一个等价,其中两个id之一(或两者)相等会导致整个MyObject.equals()方法返回true。无论这是一件好事(我已经放弃了这个项目的方法),如果有可能定义一个可行的hashCode()方法,我就会好奇用equals()方法修正。

public class MyObject {
    private UUID id;
    private UUID secondaryId;

    public MyObject(UUID id, UUID secondaryId) {
        this.id = id;
        this.secondaryId = secondaryId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        MyObject myObject = (MyObject) o;

        // Both id and secondary Id are not null on both objects
        if (id != null && myObject.id != null && secondaryId != null &&
            myObject.secondaryId != null) {

            return id.equals(myObject.id) &&
                   secondaryId.equals(myObject.secondaryId);
        }
        // Id is not null on both objects
        else if (id != null && myObject.id != null) {
            return id.equals(myObject.id);
        }
        // Secondary id is not null on both objects
        else if (secondaryId != null && myObject.secondaryId != null) {
            return secondaryId.equals(myObject.secondaryId);
        }

        return false;
    }

    @Override
    public int hashCode() {
        // TODO: How do write a hashcode that reflects the equals method?
    }
}

从我对方式的小想法来看,似乎很难做到,因为你总是会丢失数据。当您尝试将对象与使用定义了单个ID的对象定义的两个ID匹配时,我不知道您将如何知道真相。我能想出的最佳答案是,如果你总是有一个两个 id定义的对象,你可以创建一个散列,它是两个键的两个16位散列的组合他们之间有一个标记。因此,您始终会查看第一个ID的前16位,然后查看第二个ID的后16位。这就是说 - 我不知道如何用Java这样的语言编写这种方法。

TLDR; 您如何编写hashCode()方法?

1 个答案:

答案 0 :(得分:3)

你不能。没有办法为2个不同的对象创建一个唯一的哈希码,这两个对象都是"等于"另一个对象。

引自Wikipedia

  

此方法(hashCode())的重写实现的常规协定是   它们的行为方式与同一对象的行为相等()   方法:给定对象必须始终报告相同的哈希   值(除非它被更改,以便不再使用新版本   考虑"平等"到旧),和那两个等于()的对象   说相等必须报告相同的哈希值。