这是我在 Nhibernate 3 初学者指南
中找到的代码,用于覆盖 GetHashCode
。我不明白为什么它使用结果 * 397。如果 397 只是一个随机数,他用来生成唯一的结果??
我们能否只为名字、中间名和姓氏GetHashCode
,然后使用 ^ 将它们组合在一起,它也应该生成一个唯一的结果。
public override int GetHashCode()
{
unchecked
{
var result = FirstName.GetHashCode();
result = (result*397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
result = (result*397) ^ LastName.GetHashCode();
return result;
}
}
最佳答案
将中间散列码乘以给定数字作为每个组合的一部分将意味着组合 has 代码的顺序将不是无关紧要的。
如果您只是对三个名称部分进行排他或运算,那么“John William James”将给出与“James William John”相同的哈希码。
选择397
是因为它是一个大到足以导致哈希码溢出的质数,这有助于生成良好的哈希码分布。
溢出是此代码必须位于 unchecked
block 内的原因。
关于C#:重写GetHashCode,这段代码有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7620405/