Essential C#
它包含有关如何覆盖的详细说明
GetHashCode()
正确地。
哈希代码的目的是
有效平衡哈希表
通过生成与对象的值相对应的数字。
-
相等的对象必须具有相等的哈希码(如果
a.Equals(b)
a.GetHashCode() == b.GetHashCode()
)
-
必修的:
在特定对象的生命周期内,的返回应该是常量(相同的值),即使对象的数据发生更改。在许多情况下,应该缓存方法return以强制执行此操作。
-
必修的:
GetHashCode()
必须始终成功返回值。
-
性能:
哈希代码应尽可能唯一。但是,由于哈希代码只返回
int
,对于具有可能超过int所能容纳的值的对象(实际上是所有类型的对象),哈希代码中必须存在重叠(一个明显的例子是
long
,因为有更多的可能
长的
值大于
无法唯一识别。)
-
性能:
. 例如,创建一个散列,如果不考虑在基于拉丁语的语言中字符串的分布主要集中在最初的128个ASCII字符上,则会导致字符串值的分布非常不均匀,这不是一个很强的问题
GetHashCode()
算法。
-
性能:
应针对性能进行优化。
GetHashCode()
通常用于
Equals()
-
性能:
两个对象之间的小差异应该会导致哈希代码值之间的大差异——理想情况下,对象中的1位差异平均会导致16位左右的哈希代码变化。这有助于确保哈希表保持平衡,无论它如何“bucking”哈希值。
-
攻击者应该很难创建具有特定哈希代码的对象。攻击是用大量的数据淹没一个哈希表,所有这些数据都哈希到相同的值。然后,哈希表实现变成O(n)而不是O(1),从而导致可能的拒绝服务攻击。
正如这里已经提到的,您还必须考虑一些关于重写的要点
等于()