GetHashCode用于多个布尔值

在下面的StackOverflow 问题中, 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怎么办? 这仍然是一个很好的实现还是会有点矫枉过正? 如果这有点过分,当所有字段都是bool类型时,推荐的实现GetHashCode方法是什么?

在我的情况下,我只比较两个布尔。

当你的bool字段少于30个时,你可以通过将每个bool视为哈希码的值中的一个位来实现完美的哈希方案。 “完美”我的意思是哈希等式将等同于实际相等(与“普通”哈希方案相对,其中实际相等意味着哈希相等,但反之亦然)。

代码如下所示:

 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; }