如何在 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
进行显式溢出支持。
我有一个覆盖 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
进行显式溢出支持。