重写 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 例如作为字典中的关键字。
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 例如作为字典中的关键字。