为了账号安全,请及时绑定邮箱和手机立即绑定

Double.GetHashCode() 的 C# 缺陷

Double.GetHashCode() 的 C# 缺陷

C#
喵喵时光机 2021-10-24 16:40:32
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,这两个对象似乎总是散列到相同的值(使用上面的方法,无论种子和乘数如何)。大致原理是,熵存储在最高有效位,并且该位溢出丢失重要信息。我希望对具有相似性能但具有卓越熵的双打使用不同的散列。有什么建议?编辑:请不要写/评论碰撞的必然性。
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

你可以混过去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:-) 中)您的问题。


查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 273 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信