首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetHashCode平等

GetHashCode平等
EN

Stack Overflow用户
提问于 2010-10-12 13:55:07
回答 2查看 807关注 0票数 5

我想知道这一点,所以我想我会问它。

你会看到大多数地方使用相同的语义逻辑来覆盖等于,就像成员式equality...however的GetHashCode一样,它们通常使用不同的实现:

代码语言:javascript
复制
    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }
        var other = (MyType)obj;
        if (other.Prop1 != Prop1)
        {
            return false;
        }
        return true;
    }

    public override int GetHashCode()
    {
        int hash = -657803396;
        num ^= Prop1.GetHashCode();
        return num;
    }

如果你正在为你的类型实现成员式相等(比如说存储在字典中),为什么不直接重写GetHashCode,然后对Equals执行类似这样的操作:

代码语言:javascript
复制
    public override bool Equals(object obj)
    {
        return this.HashEqualsAndIsSameType(obj);
    }

    public static bool HashEquals(this object source, object obj)
    {
        if (source != null && obj != null)
        {
            return source.GetHashCode() == obj.GetHashCode();
        }
        if (source != null || obj != null)
        {
            return false;
        }
        return true;
    }

    public static bool HashEqualsAndIsSameType<T>(this T source, object obj)
    {
        return (obj == null || obj.GetType() == typeof(T)) && source.HashEquals(obj);
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-12 13:59:53

因为确实存在冲突的风险。哈希码是而不是唯一的。他们可以(在不同的时候)证明不平等,但永远不会证明平等。查找项目时:

  • 获取哈希码不同,对象不同;丢弃它

  • 如果哈希码相同,请检查等于:

  • if Equals true

  • 否则丢弃

long为例。因为哈希码是int的,所以很容易看到有很多很多冲突。

票数 10
EN

Stack Overflow用户

发布于 2010-10-12 13:59:11

散列不是一对一的,你可以有多个不同的值散列到相同的值,但它们应该是不相等的比较。因此,就GetHashCode而言,您不能真正实现Equals。这就是为什么在哈希表中会有冲突,以及为什么哈希表查找必须涉及对GetHashCode和Equals的调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3912018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档