代码之家  ›  专栏  ›  技术社区  ›  uriDium

为了重写GetHashCode(),将两个uint组合成int的最佳方式是什么?

  •  0
  • uriDium  · 技术社区  · 15 年前

    我有一个基于两个uint值重写Equals的类。因为我已经重写了Equals,所以我需要重写GetHashCode。

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

    只使用ID字段就足够了。但在某些情况下可能会有一些限制,这就是为什么我想将ID和type结合起来的原因。

    我想把这两个数字相加,然后用异或把高阶和低阶结合起来。

    还有其他想法吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Guffa    15 年前

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

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

    public int GetHashCode() {
      return 1;
    }
    

    即使它给出了一个可怕的分布,它仍然是功能性的。

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

    public int GetHashCode() {
      return (int)Id ^ (int)Type;
    }
    
        2
  •  1
  •   Mark Byers    15 年前

    如果你知道永远不会(或很少)有复制品 id 那你就用它吧。

    但一般来说,要得到两个int的好HashCode a b 你可以选择一个小素数 p 然后计算 a + p * b .

    推荐文章