C#Hashcode返回值

时间:2014-09-09 05:25:48

标签: c# hashcode

对于给定的字符串“5”,如果我使用内置的GetHashCode()函数,返回的值是多少?我感到困惑的是它返回5的整数值

2 个答案:

答案 0 :(得分:5)

它是特定于实现的,您不应该依赖于您在一个特定实现中发生的任何事情。只依赖于guaranteed:两个相等的字符串将在同一个进程中返回相同的值。下次运行程序时,或者在不同的计算机上,相同的字符串值可以返回不同的哈希值。这意味着你永远不应该坚持GetHashCode的结果 - 它对未来的比较没有用。

如果两个字符串返回相同的哈希码,则可能相等 - 但它们可能不相同。

答案 1 :(得分:1)

string.GetHash() MSDN Docs写道:

  

如果两个字符串对象相等,则GetHashCode方法返回相同的值。但是,每个唯一字符串值都没有唯一的哈希码值。不同的字符串可以返回相同的哈希码。

     

哈希码本身并不保证稳定。对于单个版本的.NET Framework,不同版本的.NET Framework和跨平台(例如32位和64位)的相同字符串的哈希代码可能不同。在某些情况下,它们甚至可能因应用领域而异。

     

因此,哈希代码永远不应该在创建它们的应用程序域之外使用,它们永远不应该用作集合中的关键字段,并且永远不应该保留它们。

     

最后,如果需要加密强哈希,请不要使用哈希码而不是加密哈希函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.Cryptography.KeyedHashAlgorithm类派生的类。

所以关于字符串的那种“快速比较检查”功能。但是你不应该只在哈希上传。重要的是要知道这些哈希码不稳定,这意味着你必须永远不要将它们存储在文件,数据库等中。 - 不要坚持它们。

一般来说,GetHash()特定于Jon写的类实现。如果我们查看object.GetHash()的MSDN文档,我们会看到它们充当基于散列的集合的索引,因此集合索引树是平衡的。有关hasing-algorithm的更多信息,请参阅此文章。

因此,如果使用GetHash()查询同一个对象,则应返回相同的哈希码。如果您的应用程序下次运行,该代码可能会有所不同。