GetHashCode()在不同的服务器上给出不同的结果

本文关键字:结果 服务器 GetHashCode | 更新日期: 2023-09-27 17:57:45

我声明了一行类似的C#代码

int hashcode = "apple".GetHashCode();

在我的电脑、一台工作中的电脑和一位朋友的电脑上,结果是1657858284。在开发服务器上,结果是1548091822。有没有一种方法可以让我告诉项目始终使GetHashCode()产生1657858284,无论它在哪个服务器上?

更多注释起初,我注意到版本有差异。。。1657858284个结果来自.NET 3.5和.NET 4.0。1548091822来自.NET 2.0。

然后我告诉visualstudios2010将该项目编译为.net 2.0项目,但它仍然给了我1657858284。

GetHashCode()在不同的服务器上给出不同的结果

正如其他人所指出的,这与文档一致。您不能依赖GetHashCode返回相同的东西。您唯一可以依赖的不变量是,如果对象没有以任何方式更改其相等语义,它将在同一应用程序域中的同一对象上返回相同的值。如果这些条件中的任何一个都不满足——如果两个对象位于不同的应用程序域中,或者对象以改变其相等语义的方式发生了变异——那么你就无法保证"相同"的对象会返回相同的哈希代码。

您应该使用哈希代码的唯一目的就是平衡哈希表任何其他使用都是"标签外"的,风险自负。不要这么做。如果你需要一个跨任意边界工作的稳定字符串哈希,那么就使用行业标准的算法,比如SHA256之类的。

如果你感兴趣,请参阅我关于哈希问题的文章档案,了解更多细节:

http://blogs.msdn.com/b/ericlippert/archive/tags/hashing/

您可能使用了两个不同版本的.Net。MSDN文章中提到了这种行为:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
备注:

GetHashCode方法的默认实现不保证不同对象的返回值是唯一的。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间是相同的。因此,此方法的默认实现不能用作哈希目的的唯一对象标识符。

为了让您的自定义类返回稳定的哈希代码,您应该重写GetHashCode()方法,否则将使用Object类的GetHashCode方法,我认为这可能会有很大的变化。(甚至可能是特定于实例的)。

如果您需要一个校验和,例如允许您快速验证传输中的数据完整性,只需通过具有适当位数的(加密)哈希运行它,如

- MD5
- SHA256
- SHA1
- fletcher

.Net的GetHashCode并不意味着识别任何东西(32位无论如何都会很快导致冲突,这就是为什么无论如何都不能用它来识别字符串的原因。)

请注意,即使是以上四种情况也会允许碰撞(但不会很快发生);因此,请确保将其用作校验和,而不是标识。