【发布时间】:2017-03-06 09:30:50
【问题描述】:
我在大多数可等式类型的 GetHashCode 实现中使用基于 XOR 的实现。
我已阅读 several posts 解释了为什么它不是最佳解决方案,因此我决定实施 GetHashCode as suggested by Jon Skeet:
unchecked // Overflow is fine, just wrap
{
int hash = 17;
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
hash = hash * 23 + field3.GetHashCode();
return hash;
}
由于代码在大多数实现中可能是相似的,因此我尝试构建一个帮助类来计算我所有类的哈希码。这应该是一件容易的事,但 GetHashCode 的主要限制之一是它必须快速。因此,任何涉及分配的实现都可能是不可行的(例如,使用非静态类)。
理想情况下,对此类方法的调用应如下所示:
public override GetHashCode() => HashCodeCalculator.Calculate(X, Y, Z);
并拥有所有逻辑(未检查 + 素数 + 空检查...)。但是使用params 参数会隐式创建一个数组。
最好在每个类中复制散列算法吗?还是像下面这样的类一样高效?
public static class HashCalculator
{
private const int _seed = 5923;
private const int _multiplier = 7481;
public static int Add(object value) => Add(_seed, value);
public static int Add(int current, object value)
{
int valueHashCode = (value != null) ? value.GetHashCode() : 0;
unchecked
{
return (current * _multiplier) + valueHashCode;
}
}
}
然后可以这样使用:
public override int GetHashCode()
{
int result = HashCalculator.Add(Prop1);
result = HashCalculator.Add(result, Prop2);
return result;
}
【问题讨论】:
标签: c# dictionary hash