将两个整数组合成一个int以覆盖GetHashCode()的最佳方法是什么?

时间:2010-11-22 11:44:12

标签: c# .net

我有一个类,我根据两个uint值覆盖了Equals。因为我已经覆盖了Equals,所以我需要覆盖GetHashCode。

一个uint值表示一个永远不应该有重复的id。它不一定是自动递增的int值,但在大多数情况下应该是。第二个uint值表示对象的类型字段。

仅使用ID字段就足够了。但在某些情况下可能会有点限制,这就是为什么我想要结合ID和类型。

我想把两个数字加在一起,然后使用XOR将高阶位和低阶位组合。

还有其他想法吗?

2 个答案:

答案 0 :(得分:2)

哈希码仅用于在基于散列的集合中分配项目,如Dictionary,因此哈希码理想情况下应尽可能少地产生冲突。

但是,最低要求只是对于任何给定的值集,哈希码应始终相同。因此,即使这是一个有效的哈希码算法:

public int GetHashCode() {
  return 1;
}

虽然它的分布非常糟糕,但它仍然有效。

如果要在哈希码中同时使用Id和Type,可以将它们放在一起:

public int GetHashCode() {
  return (int)Id ^ (int)Type;
}

答案 1 :(得分:1)

如果您知道永远不会(或很少)重复id,那么您可以使用它。

但一般来说,为了获得两个整数ab的好HashCode,您可以选择小p并计算a + p * b