【问题标题】:.NET equivalent to java.util.Arrays.hashCode() function for arrays of intrinsic types?.NET 等效于用于内部类型数组的 java.util.Arrays.hashCode() 函数?
【发布时间】:2009-07-24 14:47:16
【问题描述】:

对于 int[]、short[]、float[] 等内在类型数组,是否有等效于 java.util.Arrays.hashCode() 的 .NET 实用程序类?

显然我可以编写自己的实用程序类,但我试图找到一个已经在 .NET 框架中可用的类。

【问题讨论】:

    标签: java .net arrays hashcode gethashcode


    【解决方案1】:

    在 .NET 4.0 中,数组将通过 IStructuralEquatable 接口支持这一点,但在此之前,恐怕你必须自己做。

    【讨论】:

      【解决方案2】:

      我很确定框架本身没有任何东西可以做到这一点。可能有一些第三方实现,但没有任何内置(和公共)的。

      【讨论】:

        【解决方案3】:

        我不知道 .Net 3.5 之前内置了这样的东西,尽管 .Net 4 很可能通过 Array 将实现的 IStructuralEquatable 接口原生支持它(感谢 Greg山毛榉指出这一点)。

        这是一个在 IEnumerable 上使用扩展方法的简单实现。

        int HashContents<T>(this IEnumerable<T> enumerable)
        {
            int hash = 0x218A9B2C;
            foreach (var item in enumerable)
            {
                int thisHash = item.GetHashCode();
                //mix up the bits.
                hash = thisHash ^ ((hash << 5) + hash);
            }
            return hash;
        }
        

        这将为{0,0}{0,0,0} 提供不同的哈希码。

        【讨论】:

        • 两个简单的问题:1) 进行移位和加法真的比乘法更快吗? 2)据我所知,如果 thisHash 的值始终为零,那么无论有多少项,最终的哈希都将为零。这似乎与您的最后一句话相矛盾。
        • 1) 在 VS2008 发布模式下,我的微基准测试表明移位加法版本的执行速度比等效乘法快 8%。 2) 谢谢,代码已修复。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-29
        相关资源
        最近更新 更多