【问题标题】:Does combining hashes from properties make sense? [duplicate]组合来自属性的哈希是否有意义? [复制]
【发布时间】:2016-09-04 18:25:44
【问题描述】:

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

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

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

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

我想知道在计算时是否应该使用乘法或加法(或完全不同的东西)。我真的从这两个部分的哈希中获得了什么吗?我真的说不出来。

【问题讨论】:

  • 我会看到this 的答案,这是一种将多个对象散列在一起的好方法。至于为什么,请参阅this answer(也链接在上面)。

标签: c# oop hash


【解决方案1】:

是的,如果您希望散列值由 两者 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();
}

【讨论】:

  • ^ 也比 * 好,因为如果任何属性最终的哈希码为 0,它将一直向下传播,最终结果也为 0。
  • 请注意,简单的 XOR 不适用于不知道哈希码分布的情况(即,如果属性是具有较小实际值范围的整数类型)。先对数字进行移位/乘法可以得到更好的哈希函数(一些指导javamex.com/tutorials/collections/…,不能很快找到更好的)
猜你喜欢
  • 2017-06-02
  • 2012-03-14
  • 2014-05-11
  • 2020-03-11
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-08-06
相关资源
最近更新 更多