doubles 的位格式将符号存储在第一位。double 的 C# 哈希算法是上下 32 位的二进制异或。
因此,当您散列双 A 及其负数 -A 时,散列的唯一区别在于第一位。
要散列多个字段,大多数参考资料建议使用以下内容:
public override int GetHashCode()
{
unchecked
{
int hash = 17;
hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
return hash;
}
}
最后,考虑两个对象,每个对象都有两个双精度值,如下所示:
对象 1:{A,-B} 对象 2:{-A,B}
对于任意两个双精度 A 和 B,这两个对象似乎总是散列到相同的值(使用上面的方法,无论种子和乘数如何)。大致原理是,熵存储在最高有效位,并且该位溢出丢失重要信息。
我希望对具有相似性能但具有卓越熵的双打使用不同的散列。有什么建议?
编辑:请不要写/评论碰撞的必然性。
繁星淼淼
相关分类