需要解释有效Java教科书中的哈希码示例

Kes*_*115 5 java hashcode effective-java

以下是第9项中的示例代码:

public final class PhoneNumber {
  private final short areaCode;
  private final short prefix;
  private final short lineNumber;

  @Override
  public int hashCode() {
    int result = 17;
    result = 31 * result + areaCode;
    result = 31 * result + prefix;
    result = 31 * result + lineNumber;
    return result;
  }
}
Run Code Online (Sandbox Code Playgroud)

Pg 48指出:"选择值31是因为它是一个奇数素数.如果它是偶数且乘法溢出,信息就会丢失,因为2的muiltiplication相当于移位."

我理解乘2的概念相当于位移.我也知道当我们将一个大数乘以一个大的奇素数时,我们仍会得到溢出(因此信息丢失).我没有得到的是为什么由大奇数素数乘法引起的信息丢失优于由大偶数乘法引起的信息丢失.

ros*_*sum 6

使用偶数乘法器,乘法后的最低有效位始终为零.对于奇数乘数,最低有效位是1或0,具体取决于先前的值result.因此偶数乘法器正在失去关于低位的不确定性,而奇数乘法器正在保留它.