【问题标题】:GetHashCode returns different ValuesGetHashCode 返回不同的值
【发布时间】:2012-12-13 01:07:07
【问题描述】:

我正在使用 Linq-to-Sql 来查询 SQL Server 数据库。此查询返回我的数据库中的实体列表。我的基础数据没有改变。

收到列表后,我会在其上调用 GetHashCode 以测试是否相等。奇怪的是,哈希值总是不同的。为什么总是不一样?

谢谢,

【问题讨论】:

  • 请记住,即使您将 GetHashCode 覆盖为基于内容,如答案所述,您仍然需要处理冲突,即具有不同值但可以解决的对象到相同的哈希码。您将无法(永远)使用该类型的数据进行无冲突哈希,您只能降低冲突率。您需要使用Equals 来确保具有相同哈希的对象确实相同。

标签: c# linq hashcode


【解决方案1】:

是不同的,因为它们是不同的对象引用。

如果您想以这种方式行事,您需要根据对象数据为您的对象覆盖 Equals()GetHashCode()

Here 你有一个关于如何做的例子,here 有一篇关于覆盖GetHashCode() 方法的指南的博客文章。希望对您有所帮助。

class TwoDPoint : System.Object
{
    public readonly int x, y;

    public TwoDPoint(int x, int y)
    {
        this.x = x;
        this.y = y;
    }

    public override bool Equals(System.Object obj)
    {
        if (obj == null) return false;

        TwoDPoint p = obj as TwoDPoint;
        if (p == null) return false;

        // Return true if the fields match
        return (x == p.x) && (y == p.y);
    }

    public override int GetHashCode()
    {
        return x ^ y;
    }
}

正如Servy 在他的评论中所说,请记住,即使覆盖GetHashCode() 方法,您也无法使用该类型的数据(永远)获得无冲突哈希,您只能减少碰撞率。您需要使用Equals() 来确保具有相同哈希的对象确实相同

【讨论】:

    【解决方案2】:

    您是否覆盖了GetHashCode()?如果不是,则默认实现是根据列表的 reference 为您提供哈希码。它与列表的内容没有任何关系。

    所以两个不同的实例意味着两个不同的哈希码。

    检查列表相等性覆盖您的实体类上的Equals(和GetHashCode())并在列表上使用SequenceEqual

    【讨论】:

      猜你喜欢
      • 2015-10-20
      • 2016-04-10
      • 2022-11-29
      • 2017-03-29
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多