覆盖哈希码最佳实践

时间:2011-08-03 17:07:17

标签: java hashcode

  

可能重复:
  Why does Java's hashCode() in String use 31 as a multiplier?

@Override public int hashCode() {
    int result = 17 + hashDouble(re);
    result = 31 * result + hashDouble(im);
    return result;
}

这是“Effective Java”中的代码。它是否广泛用于企业应用程序?我担心添加静态值。或者我们应该将17和31定义为某种Utility类中的最终变量并从那里引用它们?

也可以有人解释这些数字的用途吗? 31只是随机选择的素数吗?

1 个答案:

答案 0 :(得分:0)

是的,我一直看到这样的代码。

我认为这种做法没有任何问题,我没有看到任何的好处将常量分解为外部类(请注意,在程序运行时,值显然不能改变)

数字是可能在某种程度上任意选择的素数。

我没有有效的Java,但我找到了以下引用:

  

选择值31是因为它是奇数素数。如果它是均匀的   并且乘法溢出,信息将丢失,如   乘以2相当于移位。使用的好处   素数不太清楚,但它是传统的。 31的不错的财产是   乘法可以用移位和减法代替   为了更好的性能:31 * i ==(i <&lt; 5) - i。现代VM执行此操作   自动进行优化。