String.GetHashCode()返回不同的值

Mar*_*ler 19 c# string .net-4.0 gethashcode

为什么GetHashCode()为同一个字符串返回不同的值?我无法描述如何复制这个,但相信这不是一个恶作剧,以下两行来自我的观察窗口,分别是两次:

"DDD.Events.Application.ApplicationReferenceCreated".GetHashCode() -1386151123 int
"DDD.Events.Application.ApplicationReferenceCreated".GetHashCode() 1858139950 int
Run Code Online (Sandbox Code Playgroud)

怎么会发生这种情况?

我不知道这是否有帮助,但我在VS 2010中运行.NET 4.0并且我正在调试NServiceBus应用程序.

更新:

如果你想知道我最后做了什么,看看这个线程:你能在x64模式下运行时生成x86哈希值吗?

Pet*_*old 17

根据文件:

如果两个字符串对象相等,则GetHashCode方法返回相同的值.但是,每个唯一字符串值都没有唯一的哈希码值.不同的字符串可以返回相同的哈希码.

因此,必须在两个调用中发挥一些其他效果才能产生不同的结果.一种理论是您在调用之间切换平台,从x86到x64,反之亦然.

  • `Object.GetHashCode`(http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)的文档说:"对象的GetHashCode方法必须始终返回相同的哈希码.因为没有对对象状态的修改来确定对象的Equals方法的返回值.请注意,这仅适用于当前应用程序的执行,并且如果再次运行应用程序,则可以返回不同的哈希代码. " 换句话说,不要*持久化哈希码或依赖它们从一次运行到下一次运行是相同的. (12认同)
  • 是啊,你说得对.我已经确认通过创建一个控制台程序并调用Console.WriteLine("DDD.Events.Application.ApplicationReferenceCreated".GetHashCode()).然后我更改平台并再次运行它.返回的值是我上面提到的值. (5认同)
  • `哈希码本身不能保证稳定。对于单个 .NET 版本,相同字符串的哈希代码在不同 .NET 实现、不同 .NET 版本以及不同 .NET 平台(例如 32 位和 64 位)之间可能有所不同。在某些情况下,它们甚至可能因应用程序领域而异。这意味着同一程序的两次后续运行可能会返回不同的哈希代码。` https://learn.microsoft.com/en-us/dotnet/api/system.string.gethashcode?view=netframework-4.8 (3认同)
  • +1“一个理论...”之后的答案部分是答案的重要部分,解决了我的问题。另一部分很明显! (2认同)