Gee*_*eek 4 java algorithm hashcode
可能重复:
为什么String中的Java hashCode()使用31作为乘数?
为什么在hashCode中使用素数?
从Effective Java Item 9:覆盖equals时始终覆盖hashCode请考虑以下相关代码片段,该代码片段覆盖Object类中定义的hashcode().
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
......//Rest ignored on purpose
.....
private volatile int hashCode; // (See Item 71)
@Override public int hashCode() {
int result = hashCode;
if (result == 0) {
result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
hashCode = result;
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么选择非零初始值"17".我也理解乘法是在每一步中完成的,因此字段的顺序在计算中起着重要作用hashcode().但我不明白选择31作为乘法值的原因.有人可以向我解释原因吗?这就是布洛赫对31所说的话,但我并没有真正理解.我特别不理解下面的斜体字.
选择值31是因为它是奇数素数.如果它是偶数并且乘法溢出,则信息将丢失,因为乘以2相当于移位.使用素数的优势不太明显,但它是传统的.
向左移位只会在右侧引入一个零,并在数字的二进制表示的左侧丢失一点,因此这是一个明显的信息丢失.重复此过程会逐渐丢失从早期计算中累积的所有信息.这意味着输入哈希码计算的字段越多,对早期字段的最终结果的影响就越小.
| 归档时间: |
|
| 查看次数: |
7848 次 |
| 最近记录: |