为什么“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这个质数还有什么“特别”的地方吗?
25790 次浏览

可能是因为397是一个大小足够的素数,可以导致 result 变量溢出,并在某种程度上混合散列的位,从而提供更好的散列代码分布。397没有什么特别之处可以区别于其他同等数量的质数。

Resharper 使用的散列看起来像是 FNV散列的变体。FNV 经常用不同的素数来实现。有一个关于 FNV 给你质数的合适选择的讨论。