我有人使用Type.GetHashCode,就像它是主键一样。我认为这是一个可怕的想法,但我想知道是否存在某种记录的特殊情况,表明没有两种类型具有相同的哈希码。
答案 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)
为对象生成哈希码的目标是尽可能唯一,给定数据类型以避免表中的冲突。但是,它绝对不能保证。许多哈希表实现从每个哈希代码桶链接(数组列表)来处理冲突。