代码之家  ›  专栏  ›  技术社区  ›  KOT

小班的好杂烩(覆盖GetHashCode)

  •  4
  • KOT  · 技术社区  · 16 年前

    我使用了一些包含1-2个int的标识类/结构,可能还有一个datetime或一个小字符串。我把这些当作字典里的键。

    对于这样的事情,什么是GetHashCode的好重写?一些很简单但仍有希望的事情。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Oliver    16 年前

    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),从而导致可能的拒绝服务攻击。

    正如这里已经提到的,您还必须考虑一些关于重写的要点 等于()