GetHashCode()在不同的服务器上给出不同的结果?
我宣布的代码,像这样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。 此行为注意到MSDN文章:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
从言论:
GetHashCode方法的默认实现不保证唯一的返回值不同的对象。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间将保持不变。因此,此方法的默认实现不能用作用于散列目的的唯一对象标识符。
为了您的自定义类返回一个稳定的散列码应该重写的GetHashCode()方法,否则Object类的GetHashCode方法将被使用,这一点我觉得可以有很大的差异。 (甚至可能是特定于实例)。
正如其他人已经指出,这是根据文件。你一定不能依赖于GetHashCode返回相同的东西,永远。您可以依赖的唯一不变量是如果对象未以任何方式改变其相等语义,它将在同一appdomain中的相同对象上返回相同的值。如果没有满足任何条件 - 如果这两个对象位于不同的应用程序域中,或者对象以改变其相等语义的方式进行了变异 - 那么您无法保证“相同”对象将返回相同的散列码。
您应该使用哈希码的唯一方法是平衡哈希表。任何其他用法均为“非标签”,风险自负。不要这样做。如果你需要一个稳定的字符串散列,可以跨越任意的边界,然后使用行业标准算法,如SHA256或其他。
见我的文章归档约哈希问题的更多细节,如果这个问题你感兴趣:
如果你需要有一个校验和例如使您能够快速验证传输数据的完整性,简单地用位的适当数量(加密)哈希运行它,因为
- MD5
- SHA256
- SHA1
- fletcher
。Net的GetHashCode
并不意味着要识别任何东西(无论如何,32位将很快导致碰撞,这就是为什么你无法使用它来识别字符串的原因。)
请注意,即使上述四个将允许碰撞(但不太快);所以一定要只有用它作为校验码,不能识别。
那么,电脑之间有什么区别?不同的.NET版本,也许? – 2011-05-24 18:01:06
[来自MSDN](http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx)“.NET Framework不保证GetHashCode方法的默认实现,并且它的值.NET Framework的不同版本之间的返回值是相同的。“ – AbrahamJP 2011-05-24 18:01:58
从我的理解中,GetHashCode仅用作查找关键字,例如hashmaps。所以我不确定你可以期待GetHashCode()产生类似的结果。但我相信你可以重写GetHashCode() – Cilvic 2011-05-24 18:05:10