对于给定的字符串“5”,如果我使用内置的GetHashCode()函数,返回的值是多少?我感到困惑的是它返回5的整数值
答案 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()
查询同一个对象,则应返回相同的哈希码。如果您的应用程序下次运行,该代码可能会有所不同。