合并属性的哈希值是否有意义?

时间:2016-09-04 18:25:44

标签: c# oop hash

我试图以正确的方式进行散列(我承认我通常会有点草率,依赖于自动化管理)。我想我已经掌握了它,但我不确定它是否真的是完全正确的方法,或者我是否遗漏了某些东西(是的,我已经阅读了很多页面,但仍然...... )。

在我的班上,我设计了这样的东西。我故意忽略了Segment的定义,因为我相信我的方法在不知情的情况下是正确的。

public class Compound
{
  public Segment PartA { get; set; }
  public Segment PartB { get; set; }
  ...
  public int GetHashCode()
  {
    return PartA.GetHashCode() * PartB.GetHashCode()
  }
}

该方法似乎是安全的,因为整数不会溢出而是绕过最大值。这种方法的优点在于,两个部分实际上都会影响产生的哈希值。

我想知道在计算它时是否应该使用乘法或加法(或其他完全不同的东西)。我是否真的从两个部分的散列中获得了任何东西?我无法说出来。

1 个答案:

答案 0 :(得分:3)

是的,如果您希望哈希值由 PartAPartB确定,那么它就会出现。一般情况下,它可能是这样的:

public int GetHashCode()
{
   // hash must not throw exceptions; check for null:
   if (null == PartA) 
     return null == PartB ? 0 : PartB.GetHashCode();
   else if (null == PartB) 
     return PartA.GetHashCode(); 

   // XOR ^ is a better choice: no integer overflow and no bias
   return PartA.GetHashCode() ^ PartB.GetHashCode();
}