结合Hash of String和Hash of Long

时间:2014-11-26 15:11:46

标签: java

我有以下java类:

public class Person{
   String name;  //a unique name
   Long DoB;     //a unique time
   .
   .
   .
   @Override
   public int hashCode(){
     return name.hashCode() + DoB.hashCode();
   }

}

我的hashCode方法是否正确(即它是否会返回所有组合的唯一数量。

我有一种感觉,我在这里遗漏了一些东西。

6 个答案:

答案 0 :(得分:3)

你可以让java.util.Arrays为你做这件事:

return Arrays.hashCode(new Object[]{ name, DoB });

答案 1 :(得分:1)

除了显而易见的,你可能也希望实现equals方法......

  • 总结两个哈希码的风险很小int
  • 总和本身似乎是一种提供唯一哈希码的弱方法。我会尝试一些按位操作并使用种子。

答案 2 :(得分:1)

您可能还想使用更加流畅且更具NPE-bulletproof的内容,例如Google Guava

@Override
public int hashCode(){
    return Objects.hashCode(name, DoB);
}

@Override
public boolean equals(Object o) {
    if ( this == o ) {
        return true;
    }
    if ( o == null || o.getClass() != Person.class ) {
        return false;
    }
    final Person that = (Person) o;
    return Objects.equal(name, that.name) && Objects.equal(DoB, that.DoB);
}

编辑:

IntelliJ IDEA和Eclipse可以生成更高效的hashCode()equals()

答案 3 :(得分:0)

通常哈希码就像这样构建:

   @Override
   public int hashCode(){
     return name.hashCode() ^ DoB.hashCode();
   }

但是在执行hashcode方法时要记住的重要一点是使用它。 hashcode方法的使用是使用哈希码将不同的对象放在哈希表或其他集合中的不同桶中。因此,有一种方法可以在较低的运行时间内为不同的对象提供不同的答案,但对于每个项目都不一定是不同的,尽管它的方式更好。< / p>

  

此哈希在存储或操作时由其他代码使用   实例 - 值旨在均匀分布以用于变化   输入以便在群集中使用。这个属性很重要   存储的哈希表和其他数据结构的性能   组中的对象(&#34;存储桶&#34;)基于其计算的哈希值

  

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

答案 4 :(得分:0)

参见Bloch的Effective Java#9。

但是你应该从一个初始值开始(以便随后的零值很重要),并将应用于结果的字段与乘数组合在一起,以便顺序很重要(这样类似的类会有很多不同的哈希值。 )

此外,你将不得不对待像长字段和字符串这样的东西。例如,对于多头:

(int) (field ^ (field>>>32))

所以,这意味着:

@Override public int hashCode() {
   int result = 17;
   result += name.hashCode() == null ? 0 : name.hashCode();
   result = 31 * result + (int) (DoB ^ (DoB >>> 32));
   return result;
}

31略显神奇,但奇数素数可以使编译器更容易优化数学移位减法。 (或者你可以自己做移位减法,但为什么不让编译器去做呢。)

答案 5 :(得分:0)

您的哈希代码实现正常且正确。如果你遵循其他人提出的任何建议可能会更好,但它满足hashCode的合同,并且碰撞不是特别可能,尽管它们可能不太可能。