C#学习教程:GetHashCode()在不同的服务器上给出不同的结果?分享


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

我声明了一个C#代码行

int hashcode = "apple".GetHashCode(); 

在我的计算机,工作中的计算机和朋友的计算机上,结果是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返回相同的东西。 您可以依赖的唯一不变量是, 如果对象未以任何更改其等同语义的方式进行变异,它将在同一appdomain中的同一对象上返回相同的值 。 如果不满足任何条件 – 如果两个对象位于不同的appdomains中,或者对象以改变其等同语义的方式进行了变异 – 那么您无法保证“相同”对象将返回相同的哈希值码。

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

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

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

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

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

 - MD5 - SHA256 - SHA1 - fletcher 

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

请注意,即使上述四个也会允许碰撞(但不是很快); 所以一定要将它用作校验和,而不是识别。

上述就是C#学习教程:GetHashCode()在不同的服务器上给出不同的结果?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—猴子技术宅(www.ssfiction.com)

本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ssfiction.com/ckf/960039.html

发表评论

邮箱地址不会被公开。 必填项已用*标注