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

Joh*_*ohn 12 c# gethashcode

我声明了一个C#代码行

int hashcode = "apple".GetHashCode();
Run Code Online (Sandbox Code Playgroud)

在我的计算机,工作中的计算机和朋友的计算机上,结果是1657858284.在开发服务器上,结果是1548091822.有没有办法告诉项目始终使GetHashCode()产生1657858284,无论它在哪个服务器上?

更多说明 首先,我注意到版本有所不同...... 1657858284结果来自.NET 3.5和.NET 4.0.1548091822来自.NET 2.0.

然后我告诉视觉工作室2010将项目编译为.net 2.0项目,但它仍然给了我1657858284.

Eri*_*ert 24

正如其他人所指出的那样,这与文件一致.你永远不能依赖于GetHashCode返回相同的东西.您可以依赖的唯一不变量是,如果对象未以任何改变其等式语义的方式进行变异,它将在同一appdomain中的同一对象上返回相同的值.如果不满足任何条件 - 如果两个对象位于不同的appdomains中,或者对象以改变其等同语义的方式进行了变异 - 那么您无法保证"相同"对象将返回相同的哈希值码.

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

如果您对此主题感兴趣,请参阅我关于散列问题的文章存档以获取更多详细信息:

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


The*_*oof 16

您可能正在使用2个不同版本的.Net.在MSDN文章中注意到此行为:
http ://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
从备注:

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