【问题标题】:How is GetHashCode() implemented for Int32?GetHashCode() 是如何为 Int32 实现的?
【发布时间】:2011-04-23 01:38:16
【问题描述】:

我找遍了整个地方,但找不到任何东西。任何人都可以对此有所了解吗?

【问题讨论】:

    标签: c# .net clr


    【解决方案1】:

    根据反射器:

    public override int GetHashCode()
    {
        return this;
    }
    

    有道理,是吗?

    【讨论】:

    • 我想。我在想所有的值类型都会有一个共同的实现。
    • 不,每个值类型都有自己的。 UInt32 将自身转换为 Int32,这只是将自身转换为 Signed Int。 Int16 和 Int64 进行一些时髦的位移以生成 32 位值。 System.Boolean 根据其状态返回 0 或 1。
    • 有趣,为什么 int a = 10;int b = 10.GetHashCode(); 提供不同的 x86 指令。我们看到这个单行方法将被内联,所以它应该是相同的,但它不是
    【解决方案2】:

    将 32 位值散列到 32 位的最佳方法不是发明轮子,而是使用值本身。非常快,没有碰撞,确实是一个完美的方式。

    【讨论】:

    • 是的,但这并不一定意味着它是以这种方式实现的。 :)
    • 实际上这是一种非常糟糕的实现方式。 Per MS “为了获得最佳性能,哈希函数应该为所有输入生成均匀分布,包括高度聚集的输入。这意味着对对象状态的小修改应该导致对生成的哈希码的大修改以获得最佳哈希表表现。” (msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) 这种实现虽然简单,但会导致错误的集群,并且在将整数用作哈希表键时会导致糟糕的性能。
    • @JeffWalkerCodeRanger 这通常是正确的。但是大多数哈希表都是通过hashCode % bucketLength 实现的。因此0, 1, 2, 3, ...的公共序列将具有完美的哈希码。但是,如果您的输入是 0, 32, 64, 96, 128, ... 任何 2 的幂次方桶大小数组
    猜你喜欢
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2017-02-08
    • 2014-11-08
    • 2013-07-06
    • 2023-03-24
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多