如何在 C# 结构中实现 GetHashCode()

How to implement GetHashCode() in a C# struct

我有一个覆盖 Equals() 方法的结构,编译器抱怨 GetHashCode() 没有被覆盖。

我的结构:

  private struct Key
  {
    ...

    public override int GetHashCode()
    {
      return ?;
    }

    public int FolderID;
    public MyEnum SubItemKind;
    public int SubItemID;
  }

实施GetHashCode()方法的正确方法是什么?

一)

    return FolderID ^ SubItemKind.GetHashCode() ^ SubItemID;

或 b)

    return FolderID.GetHashCode() ^ SubItemKind.GetHashCode() ^ SubItemID.GetHashCode();

总是后者。前者是不够的,因为大多数位是 0(您的数字很可能很小),而这些零位于最高有效位。您会浪费大量的哈希码,从而导致更多的冲突。

另一种常见的做法是将每个项目乘以质数并依靠溢出:

return unchecked(FolderID.GetHashCode() * 23 * 23 
                 + SubItemKind.GetHashCode() * 23 
                 + SubItemID.GetHashCode());

编辑:根据 stakx 的评论,已更新为使用 unchecked 进行显式溢出支持。