【问题标题】:C# Overriding the GetHashCode methodC# 重写 GetHashCode 方法
【发布时间】:2011-09-05 09:25:32
【问题描述】:

this 示例中,发帖人已经覆盖了获取哈希码方法。我知道这样做是为了为返回的对象提供更好的哈希值,减少冲突的数量,从而减少调用Equals() 的次数。

我想知道的是,这个算法是如何计算出来的:

return 17 + 31 * CurrentState.GetHashCode() + 31 * Command.GetHashCode();

选择相关数字是否有特殊原因?我可以简单地选择我自己的号码来输入吗?

【问题讨论】:

  • 仅供参考,MS C# 编译器(用于匿名类型)使用 -1134271262 的种子和 -1521134295 的乘数。只是说'
  • @MarcGravell:你有那个来源吗?
  • @DeepSpace101 ILDASM ;p
  • @MarcGravell:我在 ILDASM 中看到了相同的 -1521134295 乘数,但 seed 似乎是一个复合种子(它是一个随机 int32 乘以相同的乘数)。所以种子不仅是 NOT 素数(与流行的看法相反),它也是基于匿名类型成员名称/类型/计数的随机数。诡异的。任何想法为什么?
  • @DeepSpace 无。很有趣。

标签: c# algorithm hashcode state-machine


【解决方案1】:

通常你应该选择素数。这有助于避免为不同的输入参数获得相同的哈希值。

【讨论】:

    【解决方案2】:

    质数通常用于哈希码计算以最小化冲突。如果你在这个 iste 上搜索 hashcodeprime numbers,你会找到一些详细的解释(注意它是特定语言的):

    【讨论】:

      【解决方案3】:

      您通常希望使用素数(如上所述),因为它减少了冲突的机会(两个实例产生相同的结果)。欲了解更多信息,请参阅:http://computinglife.wordpress.com/2008/11/20/why-do-hash-functions-use-prime-numbers/

      【讨论】:

        猜你喜欢
        • 2019-02-02
        • 1970-01-01
        • 2010-10-16
        • 2010-10-20
        • 2013-08-06
        • 2012-05-26
        相关资源
        最近更新 更多