java - Effective Java教科书中的哈希码示例需要解释

标签 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;
  }
}

第 48 页指出:“选择值 31 是因为它是一个奇素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 是等价的转移。”

我理解乘以 2 等同于位移的概念。我也知道当我们将一个大数乘以一个大的奇质数时,我们仍然会溢出(因此信息丢失)。我不明白的是,为什么由大奇素数乘法产生的信息损失比由大偶数乘法产生的信息损失更可取。

最佳答案

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

关于java - Effective Java教科书中的哈希码示例需要解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10915309/

相关文章:

java - 在 synchronized block 中使用 Vector 有什么区别吗?

java - 如何在java中调用带有嵌套泛型的构造函数

java - 在java中重写equals和hashcode方法?

java - 多个线程读取变量

java - Cassandra 控制台日志消息

java - 编译Java错误,无法让构造函数工作

java - Java String 哈希码溢出的后果

rust - 如何在 HashSet 或 HashMap 中使用自定义哈希函数?

java - JavaBean 的 getter/setter 实现中可空 java.util.Date 的 'Defensive Copying' 的优雅实现示例?

java - Effective java Item no 74(on serialization) : Implement Serializable judiciously