ntg*_*ntg 1 java hash hashcode
哈希函数非常有用且用途广泛。通常,它们用于将一个空间映射到一个更小的空间。当然,这意味着两个对象可能会散列到相同的值(碰撞),但这是因为您正在减少空间(鸽笼原理)。函数的效率很大程度上取决于哈希空间的大小。
令人惊讶的是,许多 Java hashCode 函数正在使用乘法来生成新对象的哈希码,如下所示(create-a-hashcode-method-java)
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((email == null) ? 0 : email.hashCode());
result = prime * result + (int) (id ^ (id >>> 32));
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果我们想在同一范围内混合两个哈希码,xor 应该比加法好得多,我认为传统上是这样使用的。如果我们想增加空间,移动一些字节然后异或仍然是有意义的。我想乘以 31 几乎与将一个哈希值移动 1 然后添加相同,但它的效率应该低得多......
虽然这是推荐的方法,但我想我错过了一些东西。所以我的问题是为什么会这样?
笔记:
intJava 中的类型可用于表示从 -2147483648 到 2147483647 的任何整数。对此的答案是多种因素的混合:
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |