作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
编辑:这个问题与按位运算符无关,不能用 Why are XOR often used in java hashCode() but another bitwise operators are used rarely? 回答。
我见过不同的对象哈希计算方法:
class A {
public B b;
public C c;
@Override
public boolean equals();
@Override
public int hashCode() {
return c.hashCode() ^ b.hashCode(); //XOR
return c.hashCode() + prime * b.hashCode(); // SUM
return Objects.hash(b,c); // LIB
}
}
好像LIB方法用的是SUM,但是为什么比XOR好呢?
虽然这个例子是用 Java 写的,但这个问题更多的是关于数学和概率的。
最佳答案
SUM 确保您使用哈希码的所有位来传播您的哈希(在此,一个 int 的 32 位),并且不假设 sub hashcode() 实现。
XOR 仅在 B 和 C 的哈希码具有相同属性时才具有相同的属性,否则它将仅使用 B 和 C 哈希码中“有用”位数的最小值,这可能导致更差的分布,并且更频繁的碰撞。如果 B 和 C 是往往非常小的整数,则很容易看出问题,您将只使用前几位(因为 int.hashcode() 是恒等函数)。
关于java - 散列复合对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17297100/
我是一名优秀的程序员,十分优秀!