多个布尔值的 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;
}
在下面的 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;
}