我声明了C#代码行,如此
int hashcode = "apple".GetHashCode();
在我的计算机,工作中的计算机和朋友的计算机上,结果是1657858284.在开发服务器上,结果是1548091822.有没有办法让我告诉项目总是让GetHashCode()得到1657858284 ,无论它在哪个服务器上?
更多笔记 起初,我注意到版本有所不同... 1657858284结果来自.NET 3.5和.NET 4.0。 1548091822来自.NET 2.0。
然后我告诉visual studio 2010将项目编译为.net 2.0项目,但它仍然给了我1657858284。
答案 0 :(得分:24)
正如其他人所说,这符合文件。你一定不能依赖于GetHashCode返回同样的东西。您可以依赖的唯一不变量是如果对象未以任何改变其等同语义的方式进行变异,它将在同一appdomain中的同一对象上返回相同的值。如果任何这些条件得不到满足 - 如果两个对象是在不同的应用程序域,或者物体突变在改变其平等语义的方式 - 那么你有没有保证说:“相同”的对象将返回相同的哈希代码。
您应该使用哈希代码的唯一方法是平衡哈希表。任何其他用法都是“标签外”,风险自负。不要这样做。如果你需要一个适用于任意边界的稳定字符串哈希,那么使用像SHA256之类的行业标准算法。
如果您对此主题感兴趣,请参阅我关于散列问题的文章存档,以获取更多详细信息:
答案 1 :(得分:16)
您可能正在使用2个不同版本的.Net。
在MSDN文章中注意到此行为:
http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx
从评论中可以看出:
GetHashCode方法的默认实现不保证不同对象的唯一返回值。此外,.NET Framework不保证GetHashCode方法的默认实现,并且它返回的值在不同版本的.NET Framework之间是相同的。因此,此方法的默认实现不得用作散列目的的唯一对象标识符。
答案 2 :(得分:2)
要使您的自定义类返回稳定的哈希代码,您应该重写GetHashCode()方法,否则将使用Object类的GetHashCode方法,我认为这可能会有很大差异。 (甚至可能是特定于实例的)。
答案 3 :(得分:1)
如果您需要校验和,例如允许您快速验证传输中的数据完整性,只需通过具有适当位数的(加密)哈希运行它,如
- MD5
- SHA256
- SHA1
- fletcher
.Net的GetHashCode
并不意味着识别任何东西(无论如何,32位将很快导致冲突,这就是为什么你不能用它来识别字符串的原因。)
请注意,即使是上述四种也会发生碰撞(但不会很快);所以一定要只将它用作校验和,而不是识别。