这是第 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/