多个布尔值的 GetHashCode

GetHashCode for multiple boolean values

在下面的 Whosebug question 中,Jon Skeets 的回答指定了一个很好的实现是...

// Note: Not quite FNV!
public override int GetHashCode()
{
    unchecked // Overflow is fine, just wrap
    {
        int hash = (int) 2166136261;
        // Suitable nullity checks etc, of course :)
        hash = (hash * 16777619) ^ bool1.GetHashCode();
        hash = (hash * 16777619) ^ bool2.GetHashCode();
        return hash;
    }
}

如果这两个字段都是布尔值怎么办。这仍然是一个很好的实施还是会矫枉过正?如果这太过分了,当所有字段都是 bool 类型时,推荐的实施 GetHashCode 的方法是什么?

在我的例子中,我只比较两个布尔值。

当您的 bool 字段少于三十个时,您可以通过将每个 bool 视为散列码值中的单个位来实现 perfect 散列方案。 "perfect" 我的意思是散列相等等同于实际相等(与 "ordinary" 散列方案相反,其中实际相等意味着散列相等,但反之亦然)。

代码如下所示:

public override int GetHashCode() {
    var hash = 0;
    if (field1)
        hash |= 1<<0;
    if (field2)
        hash |= 1<<1;
    if (field3)
        hash |= 1<<2;
    if (field4)
        hash |= 1<<3;
    return hash;
}