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

时间:2008-09-19 15:20:46

标签: hash resharper hash-code-uniqueness

和许多人一样,我使用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素数还有一些“特殊”吗?

3 个答案:

答案 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>