重写 GetHashCode() 时,是否还应考虑基础 class 的 HashCode?

When overriding GetHashCode() should you also factor in the base class's HashCode?

class A
{
    public int Age{get;set;}
    public override GetHashCode()
    {
        return Age.GetHashCode();
    }
}

class B : A
{
    public int Name{get;set;}
    public override GetHashCode()
    {
        return HashCode.Combine(base.GetHashCode(), Name);
    }
}

类型 B 中的 GetHashCode 方法如何正确覆盖 GetHashCode,还是只计算类型 B 中字段的哈希码?

GetHashCode() 的目的是让不同的算法能够快速确定你的 class 的两个对象是否绝对不相等,然后他们必须参考可能效率低下的 Equals 方法,并允许 HashSet 或 Dictionary 等数据结构将对象分类到桶中。

GetHashCode 的唯一 要求 是比较相等的两个对象(通过 Equals 方法)必须产生相同的散列码(在另一方面,如果产生相同哈希码的两个对象不相等也是可以的。

最好构建散列码,这样

  • 碰撞很少见
  • 但实施仍然是高效的。

执行此操作的最佳方法是什么,取决于您 class 的性质和用途,只有您可以决定。

顺便说一句:(通常)在散列中包含可变属性是一个坏主意,因为这使得无法使用您的 class 例如作为字典中的关键字。