C# 从属性中组合哈希值有意义吗?

C# 从属性中组合哈希值有意义吗?,c#,oop,hash,C#,Oop,Hash,我正试图以正确的方式进行散列(我承认,依靠自动管理,我通常会有点马虎)。我想我已经控制住了,但我不确定这是否真的是完全正确的方法,或者我是否遗漏了什么(是的,我已经读了好几页,但仍然…) 在我的课堂上,我设计了这样的东西。我故意省略了段的定义,因为我相信我的方法是正确的,而我并不知道它 public class Compound { public Segment PartA { get; set; } public Segment PartB { get; set; } ...

我正试图以正确的方式进行散列(我承认,依靠自动管理,我通常会有点马虎)。我想我已经控制住了,但我不确定这是否真的是完全正确的方法,或者我是否遗漏了什么(是的,我已经读了好几页,但仍然…)

在我的课堂上,我设计了这样的东西。我故意省略了
段的定义,因为我相信我的方法是正确的,而我并不知道它

public class Compound
{
  public Segment PartA { get; set; }
  public Segment PartB { get; set; }
  ...
  public int GetHashCode()
  {
    return PartA.GetHashCode() * PartB.GetHashCode()
  }
}
该方法似乎是安全的,因为整数不会溢出,而是环绕最大值。这种方法的优点是,对我来说,这两个部分实际上都会影响生成的散列


我想知道我是否应该在计算它时使用乘法或加法(或者完全其他的东西)。我真的从这两部分的散列中得到了什么吗?我真的说不出来。

是的,如果希望哈希值同时由
PartA
PartB
确定,这很有意义。一般情况下,可能是这样的:

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();
}

是的,如果希望哈希值同时由
PartA
PartB
确定,这很有意义。一般情况下,可能是这样的:

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();
}

我会找到一种将多个对象散列在一起的好方法。请看(在上面也有链接)以及原因。我将看到一种将多个对象散列在一起的好方法的答案。请参阅(也在上面链接)了解原因。
^
也比
*
好,因为如果任何属性的哈希代码为0,它将一直向下传播,并使最终结果也为0。请注意,对于不知道哈希代码分布的情况,简单的XOR并不适用(即,如果属性是整数类型,实际值的范围很小)。首先移位/乘以数字可以得到更好的散列函数(一些指导,不能很快找到更好的散列函数)
^
也比
*
好,因为如果任何属性的散列码为0,那么它将一直向下传播,并使最终结果也为0。请注意,对于不知道散列码分布的情况(即,如果属性是实际值范围很小的整数类型),简单的XOR并不适用.先对数字进行移位/相乘可以使哈希函数更好(有些指导,不能很快找到更好的)