.NET:Type.GetHashCode保证是唯一的吗?

时间:2011-09-17 22:04:55

标签: .net clr

我有人使用Type.GetHashCode,就像它是主键一样。我认为这是一个可怕的想法,但我想知道是否存在某种记录的特殊情况,表明没有两种类型具有相同的哈希码。

3 个答案:

答案 0 :(得分:14)

GetHashCode没有任何保证,除了它可能是随机分布,而不是唯一的。 Documentation特别提到:

  

GetHashCode方法的默认实现没有   保证不同对象的唯一返回值。此外,   .NET Framework不保证默认实现   GetHashCode方法,它返回的值将是相同的   在不同版本的.NET Framework之间。因此,   此方法的默认实现不得用作唯一   用于散列目的的对象标识符。 ...如果两个对象的比较不相等,则两个对象的GetHashCode方法不必返回不同的值

鼓励随机分发以避免哈希冲突(慢词典):

  

为获得最佳性能,哈希函数必须生成随机数   所有输入的分配。

坚持GetHashCode的结果并根据此持久值做出任何决定也是一个非常糟糕的主意。相同的对象可能会在下一次执行应用程序时返回不同的哈希码:

  

对象的GetHashCode方法必须始终返回相同的值   哈希码只要没有对象状态的修改即可   确定对象的Equals方法的返回值。注意   这仅适用于当前执行的应用程序,并且   如果运行应用程序,则可以返回不同的哈希代码   再次

CLR本身changed针对.NET 1和.NET 2之间的字符串的GetHashCode实现,并对32位和64位版本使用不同的哈希算法。

来自Guidelines and rules for GetHashCode

  

GetHashCode只能做一件事:平衡哈希表。做   不要用它来做任何其他事情。

如果您希望基于对象值几乎唯一的哈希码,则应该查看cryptographic hashes

答案 1 :(得分:8)

保证不是唯一的。

如果您的程序集具有强名称,则可以使用完全限定类型名称作为标识Type的唯一键。

答案 2 :(得分:1)

为对象生成哈希码的目标是尽可能唯一,给定数据类型以避免表中的冲突。但是,它绝对不能保证。许多哈希表实现从每个哈希代码桶链接(数组列表)来处理冲突。