【问题标题】:Generate hash code based on object identity in .net根据.net中的对象身份生成哈希码
【发布时间】:2010-08-23 11:05:23
【问题描述】:

如何根据对象的身份为其生成哈希码。

我的意思是:

  • 如果object.ReferenceEquals(a, b) == true,那么ab 将获得相同的哈希码。
  • 如果object.ReferenceEquals(a, b) == false,那么ab 应该有不错的机会获得不同的哈希码,即使它们在成员上是相等的。

我拥有的是:

class SomeClassThatMakesSenseToCompareByReferenceAndByValue {
    override Equals(object o) {
        return MemberwiseEquals(o);
    }

    override GetHashCode() {
        return MemberwiseGetHashCode();
    }
}

class SomeClassThatNeedsReferenceComparison {
    SomeClassThatMakesSenseToCompareByReferenceAndByValue obj;

    override Equals(object o) {
        return o is SomeClassThatNeedsReferenceComparison && object.ReferenceEquals(this.obj, (o as SomeClassThatNeedsReferenceComparison).obj);
    }

    override GetHashCode() {
        return ?????
    }
}

【问题讨论】:

  • 这可能有助于更详细地解释您的用例。
  • "[...] 得到不同的哈希码,即使它们在成员上是相等的" - 这听起来有点奇怪。考虑GetHashCode 文档中的以下文本(在“实现者须知”下):“如果两个对象比较相等,则每个对象的 GetHashCode 方法必须返回相同的值”。不过我可能会错过一些东西。
  • 这就是我的SomeClassThatMakesSenseToCompareByReferenceAndByValue 类返回一致哈希码的原因。但在我的另一堂课中,我想根据身份使用GetHashCode AND Equals

标签: .net hashcode


【解决方案1】:

您可能正在寻找RuntimeHelpers.GetHashCode

【讨论】:

  • 完全等价于 object.GetHashCode
  • @Andrey 仅当对象的动态类型不覆盖 GetHashCode 时才等效。 @erikkallen 不客气。
【解决方案2】:

如果您不覆盖GetHashCode,它将返回该相同哈希码。

【讨论】:

  • 是的,但我需要以另一种方式访问​​该功能。
  • @erikkallen 还有什么办法?
  • 鉴于 object.ReferenceEquals(a, b) == true 我会说几乎 any 实现 GetHashCode 会为 ab 产生不同的结果(它基本上需要涉及随机元素或时间)。
  • @Fredrik Mörk 这是真的。我想指出默认实现将为成员相等的对象返回不同的哈希码。
【解决方案3】:

不要做任何事情 - 因为两个对象都指向同一个实例,所以将始终使用默认实现为两个对象生成相同的 HashCode。

【讨论】:

    猜你喜欢
    • 2014-01-06
    • 1970-01-01
    • 2011-07-30
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2013-04-11
    相关资源
    最近更新 更多