我需要一个hashCode
Java 中的实现忽略了类中字段的顺序Edge
。应该有可能 Node first 可以是 Node Second,第二个可以是 Node First。
这是我的方法取决于顺序:
public class Edge {
private Node first, second;
@Override
public int hashCode() {
int hash = 17;
int hashMultiplikator = 79;
hash = hashMultiplikator * hash
+ first.hashCode();
hash = hashMultiplikator * hash
+ second.hashCode();
return hash;
}
}
有没有一种方法可以计算出以下边缘相同但唯一的哈希值?
Node n1 = new Node("a");
Node n2 = new Node("b");
Edge ab = new Edge(n1,n2);
Edge ba = new Edge(n2,n1);
ab.hashCode() == ba.hashCode()
应该true
.
您可以使用某种交换运算来代替现在的运算,例如加法:
@Override
public int hashCode() {
int hash = 17;
int hashMultiplikator = 79;
int hashSum = first.hashCode() + second.hashCode();
hash = hashMultiplikator * hash * hashSum;
return hash;
}
我建议您仍然使用乘数,因为它为您的哈希码提供了一些熵。看我的回答在这里,其中说:
散列需要遵循的一些好的规则是:
- 混合你的操作员。通过混合操作符,可以使结果变化更大。使用简单
x * y
在这次测试中,我有一个非常
大量的碰撞。
- 使用质数进行乘法。素数具有有趣的二进制属性,导致乘法更加不稳定。
- 避免使用移位运算符(除非您真的知道自己在做什么)。他们在二进制文件中插入大量的零或一
数量,减少其他业务的波动性,甚至可能
减少可能的输出数量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)