C#哈希代码返回值
本文关键字:返回值 代码 哈希 | 更新日期: 2023-09-27 18:21:20
对于给定的字符串"5",如果我使用内置的GetHashCode()函数,返回的值是多少?我是否感到困惑,因为它返回的是整数值5?
它是特定于实现的,您不应该依赖于在一个特定实现中偶然观察到的任何东西。只依赖保证的:在相同的过程中,两个相等的字符串将返回相同的值。下次运行程序或在不同的机器上运行时,相同的字符串值可以返回不同的哈希。这意味着你永远不应该坚持GetHashCode
的结果——它对未来的比较没有用处。
如果两个字符串返回相同的哈希代码,它们可能相等,但可能不相等。
对于string.GetHash()
MSDN文档写入:
如果两个字符串对象相等,GetHashCode方法将返回相同的值。但是,并不是每个唯一字符串值都有一个唯一的哈希代码值。不同的字符串可以返回相同的哈希代码。
哈希代码本身不能保证是稳定的。相同字符串的哈希代码在不同版本的.NET Framework和单个版本的.NET框架的不同平台(如32位和64位)之间可能有所不同。在某些情况下,它们甚至可能因应用程序域而异。
因此,哈希代码永远不应该在创建它们的应用程序域之外使用,它们永远不应该用作集合中的键字段,并且永远不应该持久化。
最后,如果您需要加密强哈希,请不要使用哈希代码而不是加密哈希函数返回的值。对于加密哈希,请使用从System.Security.Cryptography.HashAlgorithm或System.Security.CCryptography.KeyedHashAlgorgorithm类派生的类。
因此,它有一种关于字符串的"快速比较检查"功能。但你不应该只转发散列。重要的是要知道这些哈希码是不稳定的,这意味着你永远不能将它们存储在文件、数据库等中——不要持久化它们。
一般来说,GetHash()
是特定于类实现的,正如Jon所写。如果我们查看object.GetHash()
的MSDN文档,我们会发现它们充当了基于哈希的集合的索引,因此集合索引树是平衡的。有关hasing算法的更多信息,请参阅本文。
因此,如果您使用GetHash()
查询同一个对象,它应该返回相同的哈希代码。如果您的应用程序下次运行,该代码可能会有所不同。