gpt4 book ai didi

Double.GetHashCode() 的 C# 缺陷

转载 作者:太空宇宙 更新时间:2023-11-03 12:12:22 28 4
gpt4 key购买 nike

double 的位格式在第一位存储符号。 double的C#哈希算法是高低32位二进制异或。

因此,当您对 double A 及其负数 -A 进行哈希处理时,哈希值的唯一区别在于第一位。

要散列多个字段,大多数引用资料建议使用类似这样的方法:

public override int GetHashCode()
{
unchecked
{
int hash = 17;

hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();
return hash;
}
}

最后,考虑两个对象,每个对象都有两个 double ,如下所示:

对象 1:{A, -B}对象 2:{-A,B}

对于任意两个 double A 和 B,这两个对象似乎总是散列为相同的值(使用上面的方法,不管种子和乘数如何)。大致原理是,熵存储在最高有效位,该位溢出会丢失重要信息。

我希望对具有相似性能但熵更高的 double 使用不同的哈希。有什么建议吗?

编辑:请不要写/评论碰撞的必然性。

最佳答案

您可以散列 long。将 int hash 替换为 long hash,如:

public override int GetHashCode()
{
unchecked
{
long hash = 17;

hash = hash * 23 + field1.GetHashCode();
hash = hash * 23 + field2.GetHashCode();

return hash.GetHashCode();
}
}

现在您解决了溢出问题。从我已经完成的测试中(在一对 double :-) )你的问题。

关于Double.GetHashCode() 的 C# 缺陷,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51485560/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com