2011-05-24 114 views
11

我宣布的代码,像这样GetHashCode()在不同的服务器上给出不同的结果?

int hashcode = "apple".GetHashCode(); 

在我的电脑,在工作中计算机C#线,和一个朋友的电脑,结果是1657858284.在开发服务器,结果是1548091822.是否有我告诉项目总是让GetHashCode()产生1657858284的方式,而不管它在哪个服务器上?

更多注意事项 起初,我注意到版本有所不同... 1657858284结果来自.NET 3.5和.NET 4.0。 1548091822来自.NET 2.0。

我再叫视觉工作室2010年编制项目作为.NET 2.0的项目,但它还是给了我1657858284.

+2

那么,电脑之间有什么区别?不同的.NET版本,也许? – 2011-05-24 18:01:06

+3

[来自MSDN](http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)“.NET Framework不保证GetHashCode方法的默认实现,并且它的值.NET Framework的不同版本之间的返回值是相同的。“ – AbrahamJP 2011-05-24 18:01:58

+0

从我的理解中,GetHashCode仅用作查找关键字,例如hashmaps。所以我不确定你可以期待GetHashCode()产生类似的结果。但我相信你可以重写GetHashCode() – Cilvic 2011-05-24 18:05:10

回答

15

这有可能是你使用2个不同版本的.NET。 此行为注意到MSDN文章:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
从言论:

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

2

为了您的自定义类返回一个稳定的散列码应该重写的GetHashCode()方法,否则Object类的GetHashCode方法将被使用,这一点我觉得可以有很大的差异。 (甚至可能是特定于实例)。

23

正如其他人已经指出,这是根据文件。你一定不能依赖于GetHashCode返回相同的东西,永远。您可以依赖的唯一不变量是如果对象未以任何方式改变其相等语义,它将在同一appdomain中的相同对象上返回相同的值。如果没有满足任何条件 - 如果这两个对象位于不同的应用程序域中,或者对象以改变其相等语义的方式进行了变异 - 那么您无法保证“相同”对象将返回相同的散列码。

您应该使用哈希码的唯一方法是平衡哈希表。任何其他用法均为“非标签”,风险自负。不要这样做。如果你需要一个稳定的字符串散列,可以跨越任意的边界,然后使用行业标准算法,如SHA256或其他。

见我的文章归档约哈希问题的更多细节,如果这个问题你感兴趣:

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

1

如果你需要有一个校验和例如使您能够快速验证传输数据的完整性,简单地用位的适当数量(加密)哈希运行它,因为

- MD5 
- SHA256 
- SHA1 
- fletcher 

。Net的GetHashCode并不意味着要识别任何东西(无论如何,32位将很快导致碰撞,这就是为什么你无法使用它来识别字符串的原因。)

请注意,即使上述四个将允许碰撞(但不太快);所以一定要只有用它作为校验码,不能识别。

相关问题