和许多人一样,我使用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?
答案 0 :(得分:150)
可能是因为397是足够大的素数,导致结果变量溢出并稍微混合散列的位,从而提供更好的散列码分布。 397没有什么特别的特殊之处,可以将它与其他相同数量的素数区分开来。
答案 1 :(得分:17)
Ben是正确的,反映大会你可以看到它只是他们选择使用的素数。
答案 2 :(得分:11)
resharper使用的哈希看起来像http://localhost:8080/system/console/configMgr/org.apache.sling.engine.impl.SlingMainServlet?post=false哈希的变体。 FNV经常用不同的素数实现。有关FNV FNV的素数的适当选择的讨论。{/ p>