C#:覆盖GetHashCode,这段代码有什么作用?

qin*_*126 2 c# nhibernate gethashcode

这是我在Nhibernate 3 Beginners Guide覆盖中找到的代码GetHashCode.我不明白为什么它使用结果*397.如果397只是一个随机数他用来产生独特的结果?

我们可以只GetHashCode使用firstname,middlename和lastname,然后使用^将它们组合在一起,它还应该生成一个唯一的结果.

public override int GetHashCode()
{
   unchecked
   {
       var result = FirstName.GetHashCode();
       result = (result*397) ^ (MiddleName != null ? MiddleName.GetHashCode() : 0);
       result = (result*397) ^ LastName.GetHashCode();
       return result;
   }
}
Run Code Online (Sandbox Code Playgroud)

Erg*_*wun 7

将中间散列码乘以给定数字作为每个组合的一部分将意味着组合的代码的排序将不是无关紧要的.

如果你只是做了一个独家或三个名字部分,那么"John William James"会给出与"James William John"相同的哈希码.

397 之所以选择它是因为它是一个足够大的素数,足以导致哈希码溢出,这有助于生成哈希码的良好分布.

溢出是此代码必须位于unchecked块内的原因.

  • 这是一个非常好的解释,但它没有解释为什么选择素数.这样做是为了降低聚类的可能性. (2认同)