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

2023-11-26

我需要一个hashCodeJava 中的实现忽略了类中字段的顺序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(使用前将#替换为@)

具有两个无顺序字段的唯一 hashCode 的相关文章

随机推荐