String.GetHashCode() 返回不同的值

Posted

技术标签:

【中文标题】String.GetHashCode() 返回不同的值【英文标题】:String.GetHashCode() returns different values 【发布时间】:2010-12-16 22:47:32 【问题描述】:

为什么 GetHashCode() 会为同一个字符串返回不同的值?我无法描述如何复制此内容,但请相信这不是一个恶作剧,并且以下两行来自我的观察窗口在两个不同的时间:

"DDD.Events.Application.ApplicationReferenceCreated".GetHashCode() -1386151123 int
"DDD.Events.Application.ApplicationReferenceCreated".GetHashCode() 1858139950 int

怎么会这样?

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

更新:

如果您想知道我最终为此做了什么,请查看此线程:Can you generate an x86 hash value when running in x64 mode?

【问题讨论】:

当您切换平台时,它不仅会返回不同的结果,而且对于我在 Linux 上使用 .Net 5 的我来说,每次启动都会返回不同的结果。它仅在应用程序运行时保持不变。 【参考方案1】:

根据documentation:

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

因此,两个调用必须有其他一些效果才能给出不同的结果。一种理论是您在调用之间切换了平台,从 x86 到 x64,反之亦然。

【讨论】:

是的,你是对的。我已经通过创建控制台程序并调用 Console.WriteLine("DDD.Events.Application.ApplicationReferenceCreated".GetHashCode()) 确认了这一点。然后我更改平台并再次运行它。返回的值就是我上面提到的值。 Object.GetHashCode (msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) 的文档说:“只要没有修改确定返回值的对象状态,对象的 GetHashCode 方法就必须始终返回相同的哈希码对象的 Equals 方法。请注意,这仅适用于应用程序的当前执行,如果再次运行应用程序,则可以返回不同的哈希码。换句话说,不要永远保持哈希码或依赖它们在一次运行到下一次运行时是相同的。 如果你确实想要一个持久的哈希码,创建一个独立于设备的序列化方法(json、XML、协议缓冲区等),将其应用于你的对象以获取一个字节[],然后对其应用哈希算法(md5、sha1 等)。 +1 One theory...之后的部分答案是答案的重要部分,解决了我的问题。另一部分很明显! The hash code itself is not guaranteed to be stable. Hash codes for identical strings can differ across .NET implementations, across .NET versions, and across .NET platforms (such as 32-bit and 64-bit) for a single version of .NET. In some cases, they can even differ by application domain. This implies that two subsequent runs of the same program may return different hash codes.docs.microsoft.com/en-us/dotnet/api/…【参考方案2】:

你有没有可能从某个地方复制了这个字符串?

我遇到了同样的问题。我复制了值,并且 BOM 标题在第一个位置不可见。

尝试检查长度,您已经看到了差异。 您也可以逐字节检查。

【讨论】:

How do I write a good answer?

以上是关于String.GetHashCode() 返回不同的值的主要内容,如果未能解决你的问题,请参考以下文章

当返回不同的小部件时,返回不同 StatefulWidgets 的方法不更新

fwrite()的返回值随着格式的不同返回值也不同;

根据接口入参不同返回不同对象集合的方法

为啥超过 255 的返回码在 C++ 中返回不同的数字?

静态工厂的第四个优点是返回对象的类可以根据输入参数的不同而不同。

为啥 GridSearchCV 返回的分数与直接运行模型返回的分数如此不同?