为什么'397'用于ReSharper的GetHashCode覆盖?

像你们中的许多人一样,我使用ReSharper来加速开发过程。 当您使用它来覆盖类的相等成员时,它为GetHashCode()生成的代码生成如下所示:

public override int GetHashCode() { unchecked { int result = (Key != null ? Key.GetHashCode() : 0); result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0); result = (result * 397) ^ ObjectId; return result; } } 

当然我有一些我自己的成员,但是我想知道的是为什么397?

  • 编辑:所以我的问题会更好措辞,是否有什么特殊的397素数之外,它是一个素数?

可能是因为397是一个足够大的主要元素,可以使结果variables溢出并在某种程度上混合散列的位,从而提供更好的散列代码分布。 397与其他相同数量的素数没有什么特别的区别。

本是正确的,反映了大会,你可以看到这只是他们select使用的素数。

resharper使用的哈希看起来像FNV哈希的变体。 FNV经常用不同的素数来实现。 这里有关于FNV素数的适当select的讨论。