我有一个类,我根据两个uint值覆盖了Equals。因为我已经覆盖了Equals,所以我需要覆盖GetHashCode。
一个uint值表示一个永远不应该有重复的id。它不一定是自动递增的int值,但在大多数情况下应该是。第二个uint值表示对象的类型字段。
仅使用ID字段就足够了。但在某些情况下可能会有点限制,这就是为什么我想要结合ID和类型。
我想把两个数字加在一起,然后使用XOR将高阶位和低阶位组合。
还有其他想法吗?
答案 0 :(得分:2)
哈希码仅用于在基于散列的集合中分配项目,如Dictionary
,因此哈希码理想情况下应尽可能少地产生冲突。
但是,最低要求只是对于任何给定的值集,哈希码应始终相同。因此,即使这是一个有效的哈希码算法:
public int GetHashCode() {
return 1;
}
虽然它的分布非常糟糕,但它仍然有效。
如果要在哈希码中同时使用Id和Type,可以将它们放在一起:
public int GetHashCode() {
return (int)Id ^ (int)Type;
}
答案 1 :(得分:1)
如果您知道永远不会(或很少)重复id
,那么您可以使用它。
但一般来说,为了获得两个整数a
和b
的好HashCode,您可以选择小p
并计算a + p * b
。