【问题标题】:C# GetHashCode with three Int16 values? [duplicate]具有三个 Int16 值的 C#GetHashCode? [复制]
【发布时间】:2012-06-02 07:53:24
【问题描述】:

我正在将此函数用于 C# 哈希映射中的一个键,例如类“字典”。

x、y 和 z 是 Int16。

public override int GetHashCode()
{
    return (x << 16) | (UInt16)y;
}

如何将其扩展到使用所有 3 个变量?


请参阅What is the best algorithm for an overridden System.Object.GetHashCode?,了解更一般的情况,其中包含任意数量、任意类型的变量。

【问题讨论】:

  • 请,请,请,不要使用公认的答案。使用上面重复问题中的答案!接受的问题无穷无尽(趋于0,趋于0xffff...,不同对象的相同哈希,不平衡的哈希等)。
  • 对于一个 Int32 中的三个 Int16,不同对象的代码是否相同?

标签: c# hash dictionary hashmap gethashcode


【解决方案1】:

对于任意类型的三个变量x、y、z,标准方法如下:

return x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode();

^ 是 XOR 运算符。

您也可以使用 XOR 运算符将其他变量合并到您的方法中。

【讨论】:

  • 标准? [需要引用]
  • 我将其称为“标准”,因为在 MSDN article 中明确提到了该方法。
  • 请注意 [1,2,3] , [2,1,3], [3,2,1] 在这里都有相同的哈希值。
  • 对于任何 x 值,[x,x,y], [x,y,x], [y,x,x] 也是如此。 Donald Knuth 没有查看 MSDN 示例 sn-ps :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-12
  • 2011-12-04
  • 1970-01-01
  • 2010-12-10
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多