使用字节数组作为字典键

这个问题在这里已经有了答案:

  • 什么是重写的System.Object.GetHashCode的最佳算法? 17个答案

  • 散列的更好选择可能是这样的:

    public override int GetHashCode(byte[] obj)
    {
        int hash = 0;
        for (int i = 0; i < obj.Length; i++)
        {
            exponents = [0, 8, 16, 24];
            exponent = exponents[i % 4];
    
            unchecked
            {
                hash += obj[i] * (1 << i);
            }
        }
        return hash;
    }
    

    从概念上讲,这将4个字节的每个块转换为一个int,因为它们都是32位,然后将它们与标准整数溢出相加。 因此,长度为4或更小的所有唯一字节数组将映射到不同的哈希码,并且(给定随机数据)较大的数组应该散列在哈希空间中。 如果你期待很多非常相似的数组,或者每4或者4次重复的数组,这可能不是最好的策略。


    MurmurHash非常快速且相当简单。 有很多基于.NET的实现,但我不完全知道它们是如何实现的。

    链接地址: http://www.djcxy.com/p/39767.html

    上一篇: Using byte array as dictionary key

    下一篇: Creating a unique hash code based on some properties of an object