【问题标题】:Is .GetHashCode guaranteed to be the same across systems/platform versions? [duplicate].GetHashCode 是否保证跨系统/平台版本相同? [复制]
【发布时间】:2011-10-22 12:01:23
【问题描述】:

可能重复:
Can I depend on the values of GetHashCode() to be consistent?

如果我在两个系统/框架版本中使用Object.GetHashCode() 方法,我能否保证为相同的输入获得相同的值?换句话说,它的值是否是持久数据的好键?

注意:我不关心这个问题中的碰撞。

作为奖励,我能否保证在 Mono 和 Microsoft .Net 中获得相同的价值?

【问题讨论】:

  • 据我所知,您甚至不能保证在完全相同的机器上两次运行时获得相同的值。
  • 如果你想要一个具体的反例,string.GetHashCode() 的实现已经改变

标签: c# hash compatibility gethashcode


【解决方案1】:

没有。其他问题? :-)

所使用的算法未发布,也未在 Ecma 标准中。

我会引用MSDN上的String.GetHashCode(我觉得这个例子已经足够好了)

GetHashCode 的行为取决于它的实现,它可能会从一个版本的公共语言运行时更改为另一个版本。发生这种情况的一个原因是为了提高 GetHashCode 的性能。

【讨论】:

    【解决方案2】:

    从技术上讲,这取决于您的类如何覆盖GetHashCode。如果你有这个:

    class MyClass
    {
        public override int GetHashCode() { return 42; }
    }
    

    那么这在 Mono 和 .NET 中是一致的。 :)

    当然,如果您的GetHashCode 实现依赖于不能保证跨平台一致性的类型(例如string),那么MyClass.GetHashCode() 也将不一致。

    【讨论】:

    • 生命、宇宙和万物的终极问题的答案是什么? (new MyClass()).GetHashCode() 确实。
    【解决方案3】:

    答案是否定的

    规则:GetHashCode 的使用者不能依赖它随着时间的推移或跨应用程序域而保持稳定

    假设您有一个 Customer 对象,其中包含许多字段,例如名称、地址等。如果您在两个不同的进程中创建两个具有完全相同数据的此类对象,则它们不必返回相同的哈希码。如果你周二在一个进程中创建了这样一个对象,关闭它,然后在周三再次运行程序,哈希码可能会不同。/blockquote>

    阅读Guidelines and rules for GetHashCode的全文

    【讨论】:

      【解决方案4】:

      如果你覆盖GetHashCode() 并提供你自己的实现,你可以返回同样的东西。尽管我不确定您为什么要将其返回用作持久存储的密钥,但是当您的对象首次插入存储库时,为您的对象提供自己的预定(计算)密钥同样容易。恕我直言,但使用返回的哈希码作为密钥似乎你为了自己的利益而过于聪明。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-12-01
        • 1970-01-01
        • 2019-09-01
        • 2018-04-17
        • 2016-03-28
        • 2010-10-13
        • 1970-01-01
        相关资源
        最近更新 更多