我试图以正确的方式进行散列(我承认我通常会有点草率,依赖于自动化管理)。我想我已经掌握了它,但我不确定它是否真的是完全正确的方法,或者我是否遗漏了某些东西(是的,我已经阅读了很多页面,但仍然...... )。
在我的班上,我设计了这样的东西。我故意忽略了Segment
的定义,因为我相信我的方法在不知情的情况下是正确的。
public class Compound
{
public Segment PartA { get; set; }
public Segment PartB { get; set; }
...
public int GetHashCode()
{
return PartA.GetHashCode() * PartB.GetHashCode()
}
}
该方法似乎是安全的,因为整数不会溢出而是绕过最大值。这种方法的优点在于,两个部分实际上都会影响产生的哈希值。
我想知道在计算它时是否应该使用乘法或加法(或其他完全不同的东西)。我是否真的从两个部分的散列中获得了任何东西?我无法说出来。
答案 0 :(得分:3)
是的,如果您希望哈希值由 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();
}