边缘类的Java hashCode()重写

边缘类的Java hashCode()重写,java,graph,hashcode,Java,Graph,Hashcode,我正在用Java开发一个图形库(https://github.com/aisthesis/java-graph2012 对于完整上下文),并且需要为边不定向的WeightedEdge类重写hashCode()。也就是说,我设置了equals()覆盖方法,以便对于2条加权边e1和e2,如果满足以下条件之一,则它们相等(from()和to()方法返回边的尾部和头部顶点): e1.from()==e2.from()&&e1.to()==e2.to()或 e1.from()==e2.to()&&e1.t

我正在用Java开发一个图形库(https://github.com/aisthesis/java-graph2012 对于完整上下文),并且需要为边不定向的WeightedEdge类重写hashCode()。也就是说,我设置了equals()覆盖方法,以便对于2条加权边e1和e2,如果满足以下条件之一,则它们相等(from()和to()方法返回边的尾部和头部顶点):

  • e1.from()==e2.from()&&e1.to()==e2.to()或
  • e1.from()==e2.to()&&e1.to()==e2.from()
  • 在另一个上下文中,我想创建一个加权边的HashSet,除非我也重写hashCode()方法,使其与equals()重写一致,否则我最终会得到重复的边

    因此,这里是我的简单解决方案(在这里,我没有干扰我的Vertex类的Java默认hashCode(),并且从和引用Vertex对象):

    我的理由是:

  • 它的效率是很高的,因为加法的效率几乎和我们所能得到的一样高(我想我们也可以对2个哈希码进行异或运算?)
  • 它是对称的,所以 从和到反转将得到相同的哈希代码
  • 通常会 如果顶点不同,请提供不同的哈希代码
  • 第3点显然远不是100%,所以我的部分问题是这是否重要


    我的一般问题是:在这种情况下,这是重写hashCode()的好方法吗?

    如果
    有一个合理的
    hashCode()
    实现,您的解决方案是好的。

    如果
    有一个合理的
    hashCode()
    实现,您的解决方案很好。

    向我们展示您的
    WeightedEdge
    类。
    from
    to
    的类型是什么?第83ff行。这些都是相关的
    from
    to
    都是顶点对象,我没有覆盖默认的hashCode()方法。向我们展示您的
    WeightedEdge
    类。
    from
    to
    的类型是什么?第83ff行。这些都是相关的
    from
    to
    都是顶点对象,我没有覆盖默认的hashCode()方法。你认为在向哈希集添加大量边时,xor ing会更快,同时还能很好地避免冲突吗?@MarshallFarrier:我没有理由认为xor会比整数加法更快,或者导致更少的冲突。我认为这两种方法都能很好地工作。你认为在向哈希集添加大量边时,xor ing会更快,同时还能很好地避免冲突吗?@MarshallFarrier:我没有理由认为xor会比整数加法更快,或者导致更少的冲突。我认为两者都应该很好地发挥作用。
    @Override
    public int hashCode() {
        return from.hashCode() + to.hashCode();     
    }