我需要一个hashCodeJava实现,它忽略类中字段的顺序Edge。首先,节点可以是第二个节点,第二个可以是节点优先。
hashCode
Edge
这是我的方法取决于顺序:
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。
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在此测试中使用,我发生了很多碰撞。 使用质数进行乘法运算。质数具有有趣的二进制性质,导致乘法更不稳定。 避免使用移位运算符(除非您真的知道自己在做什么)。它们在数字的二进制数中插入大量零或一,从而降低了其他运算的波动性,甚至可能缩小您可能的输出数。
遵循一些良好的哈希规则是:
x * y