为什么它必须是财产?如果它是一个方法,GetChecksum() 那么你就不必有任何特殊的逻辑,这样它就不会将自己包含在校验和计算中。现在,您创建的内容与现有的 GetHashCode() 方法的用途几乎完全相同——只需提供一个实现即可。
通常,人们会为每个类显式编码 GetHashCode(),尽管快速的网络搜索会发现使用反射来提供通用(虽然速度较慢)机制的方法。通常人们会将想要包含在哈希码中的每个字段,将其转换为整数并将其乘以一个固定数字,以便具有不同字段值的不同对象给出不同的哈希码,这些哈希码很好地分布在整数范围内。
例如,Resharper 生成如下所示的 GetHashCode() 方法:
public override int GetHashCode()
{
unchecked
{
int result = a;
result = (result * 397) ^ (b != null ? b.GetHashCode() : 0);
result = (result * 397) ^ c.GetHashCode();
return result;
}
}
其中 a 是 int,b 是 string,c 是 long。中间值(结果)乘以 397,并在每个步骤中使用下一个组件的哈希码。未检查意味着如果整数溢出(这很可能),那么我们丢弃溢出并回绕。在大多数情况下,这应该可以合理地覆盖整数空间——尽管我建议测试覆盖率,因为糟糕的哈希码可能会对系统性能产生严重后果。
应注意处理任何字段的零,以免您乘以零并最终得到大量散列码为零的对象。