当hashcode跨越整数边界时的解决方法

时间:2015-09-15 10:50:32

标签: java integer hashcode

我有一个POJO有〜450个字段,我正在尝试使用hascode来比较这个POJO的实例。我用eclipse生成了重写的hashCode()方法。在很多情况下,生成的哈希码跨越整数边界。结果,进行比较变得越来越困难。什么是解决方法?

hashCode()方法如下:

public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + ((stringOne == null) ? 0 : stringOne.hashCode());
    result = prime * result + intOne;
    result = prime * result + Arrays.hashCode(someArray);
    result = prime * result + ((stringTwo == null) ? 0 : stringTwo.hashCode());
    result = prime * result + intTwo;
    result = prime * result + intThree;
    result = prime * result + ((stringThree == null) ? 0 : stringThree.hashCode());
    result = prime * result + ((stringFour == null) ? 0 : stringFour.hashCode());
    result = prime * result + ((stringFive == null) ? 0 : stringFive.hashCode());
    result = prime * result + ((objectOne == null) ? 0 : objectOne.hashCode());
    result = prime * result + ((objectTwo == null) ? 0 : objectTwo.hashCode());
    return result;
}

2 个答案:

答案 0 :(得分:1)

整数溢出是hashCode()计算的正常部分。这不是问题。

例如,hashCode()的{​​{1}}通常是否定的。

String

如果System.out.println("The hashCode() of this String is negative".hashCode()); 计算可能会溢出,显然这可能意味着不等hashCode() s可能具有相同的Object,但这可能发生没有溢出。例如,这两个都打印hashCode

true

唯一的要求是相等的对象应具有相同的System.out.println("Aa".hashCode() == "BB".hashCode()); System.out.println(new HashSet<>(Arrays.asList(1, 2)).hashCode() == Collections.singleton(3).hashCode()); 。不要求不同的对象具有不同的hashCode s。

hashCodehashCode()也应该很快。您可以通过比较最有可能不同的字段并提前返回来提高equals()的性能。您无法使用equals()执行此操作,因为计算必须涉及所有相关字段。如果您的班级有450个字段,您可能需要考虑缓存hashCode()的结果,或者更好地将您的班级重构为较小的单元。

要考虑的另一件事是你是否需要覆盖这些方法。只有当对象将用作基于散列的容器中的键时才是绝对必要的,例如hashCode()

答案 1 :(得分:0)

解决方法是使用不同的方法来计算哈希码。例如,您可以xor 450个字段的哈希码(顺便说一句:哇!),但是如果不了解您的对象,很难说这对您的特定情况是否是一个好方法。

理想情况下,由于哈希码用于散列,因此不相等的对象也应该以高概率生成不同的哈希码。