GetHashCode()仅来自布尔值

Han*_*ank 10 .net c# boolean hashcode

我有一个不可变类,其唯一的字段是bool[](在运行时确定的大小).

如何计算此类的良好哈希码?通常我会调用GetHashCode()每个字段,并将它们与这些运算符中的一个结合起来:+ | &但是因为唯一可能的哈希码是0for false1for true,所以这并不能让我到处都是.我的实现只需要使用bools,并且必须适用于任意大小的数组.

(可能并不重要,但我在C#/ .NET编码.)

jas*_*son 10

假设你bool[]的名字是bools:

unchecked { 
    int hash = 17;
    for(int index = 0; index < bools.Length; index++) {
        hash = hash * 23 + bools[index].GetHashCode();
    }
    return hash;
}
Run Code Online (Sandbox Code Playgroud)

  • @mcarbal:首先,它没有.考虑`{false,true}`和`{true,false}`.第一个将给出23*(23*17 + 0)+ 1的哈希码.第二个将给出哈希码23*(23*17 + 1)+ 0.注意这些是不同的值.即使所有的值都是"false",它仍然会产生一个不同的哈希码(`Math.Pow(23,bools.Length)*17`).其次,您不能指望不同阵列的不同哈希码.有更多的数组(`Math.Pow(2,Int32.Max)`)而不是哈希码(`Int32.Max - Int32.Min + 1`).碰撞必须发生.那么,你的意思是"什么都行不通?" (2认同)