小编典典

具有两个无序字段的唯一hashCode

java

我需要一个hashCodeJava实现,它忽略类中字段的顺序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


阅读 230

收藏
2020-11-16

共1个答案

小编典典

您可以使用某种交换运算来代替现在的运算,例如加法:

@Override
public int hashCode() {
    int hash = 17;
    int hashMultiplikator = 79;
    int hashSum = first.hashCode() + second.hashCode();
    hash = hashMultiplikator * hash * hashSum;
    return hash;
}

我建议您仍然使用乘数,因为它为哈希码提供了一些熵。在这里查看我的回答

遵循一些良好的哈希规则是:

  • 混淆您的运营商。通过混合您的运算符,可以使结果变化更多。仅x * y在此测试中使用,我发生了很多碰撞。
  • 使用质数进行乘法运算。质数具有有趣的二进制性质,导致乘法更不稳定。
  • 避免使用移位运算符(除非您真的知道自己在做什么)。它们在数字的二进制数中插入大量零或一,从而降低了其他运算的波动性,甚至可能缩小您可能的输出数。
2020-11-16