全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C# GetHashCode()方法的重写规则 - 保证在字典和哈希表中正常工作

相等的对象必须返回相同的哈希码,哈希码相等不保证对象相等;重写 GetHashCode() 时必须同步重写 Equals(),且二者逻辑一致,仅基于不可变的关键字段计算,推荐使用 HashCode.Combine 或 hash * 31 + field?.GetHashCode() ?? 0。

重写 GetHashCode() 的核心原则是:**相等的对象必须返回相同的哈希码;哈希码相等不意味着对象一定相等(允许哈希冲突,但应尽量减少)**。这是 .NET 中字典(Dictionary)、哈希集(HashSet)等哈希结构正确工作的基础。

必须同时重写 Equals() 和 GetHashCode()

如果只重写 GetHashCode() 而不重写 Equals(),或反之,会导致逻辑不一致:两个 Equals() 返回 true 的对象可能因哈希码不同被散列到不同桶中,从而在字典中查不到;反之,若仅重写 Equals() 而哈希码始终为默认(如引用哈希),则所有实例可能被塞进同一个桶,严重退化性能。

  • 重写 Equals(object) 时,也应重写 Equals(T)(实现 IEquatable)以提升性能
  • GetHashCode() 的实现必须与 Equals() 的逻辑严格一致——即决定“相等性”的字段,也必须参与哈希码计算
  • 若类是可变的(字段后续可能修改),且该类实例会用作字典键或加入 HashSet,则不应重写 GetHashCode()(或确保关键字段不可变)

哈希码应基于不可变、参与相等判断的关键字段

哈希码应由那些真正定义对象“身份”的字段组合计算得出,且这些字段在对象生命周期内不应改变(否则哈希码变化将导致字典中丢失条目)。例如,一个表示二维坐标的 Point 类,XY 是决定相等性的唯一字段,也是哈希计算的唯一输入。

  • 避免使用 DateTime.Now、随机数、数据库 ID(未加载时为 0)、或任何可能变化的属性
  • 推荐使用 HashCode.Combine(field1, field2, ...)(.NET Core 2.1+),它能高效、均匀地混合多个值
  • 手动实现时,常用公式:hash = hash * 31 + field?.GetHashCode() ?? 0(注意空值处理和乘数选择)

避免常见错误:空引用、浮点数、集合类型直接哈希

直接对可能为 null 的引用类型调用 .GetHashCode() 会抛出异常;float/double 的 NaN 或精度问题会导致相等对象哈希不一致;对数组、列表等集合类型直接调用 GetHashCode() 通常返回引用哈希,而非内容哈希,违背相等性契约。

  • 字符串、数值类型可直接用 .GetHashCode();引用类型建议用空合并: name?.GetHashCode() ?? 0
  • 浮点字段建议先转为 int/long 表示(如 BitConverter.ToInt32(BitConverter.GetBytes(value))),再参与计算
  • 集合字段(如 IList)需遍历元素逐个哈希并组合,或使用 Enumerable.SequenceEqual 配合自定义哈希逻辑(注意性能)

测试你的实现是否合理

编写简单单元测试验证两条基本规则:

  • 相同对象多次调用 GetHashCode() 应返回相同值(稳定性)
  • 两个 Equals()true 的实例,其 GetHashCode() 必须相等
  • 可额外检查哈希分布(如生成大量实例,观察哈希码模小质数后的余数分布是否相对均匀)

基本上就这些。不复杂但容易忽略细节,尤其在涉及可变状态或嵌套对象时。守住“相等 ⇒ 哈希相等”这一底线,就能让字典和哈希表稳稳工作。


# c#  # 质数  # .net  # Float  # Object  # NULL  # 字符串  # int  # double  # 值类型  # 引用类型  # 对象  # 数据库  # 重写  # 推荐使用  # 不应  # 这是  # 这一  # 随机数  # 多个  # 浮点  # 则是  # 遍历 


相关文章: 如何在阿里云虚拟主机上快速搭建个人网站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  网站制作员失业,怎样查看自己网站的注册者?  广州商城建站系统开发成本与周期如何控制?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  如何用虚拟主机快速搭建网站?详细步骤解析  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速搭建高效香港服务器网站?  建站之星客服服务时间及联系方式如何?  高防服务器如何保障网站安全无虞?  如何高效配置香港服务器实现快速建站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站主机默认首页配置指南:核心功能与访问路径优化  香港服务器租用费用高吗?如何避免常见误区?  如何用PHP工具快速搭建高效网站?  如何在VPS电脑上快速搭建网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  如何在IIS中新建站点并解决端口绑定冲突?  用v-html解决Vue.js渲染中html标签不被解析的问题  如何快速完成中国万网建站详细流程?  浅析上传头像示例及其注意事项  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  创业网站制作流程,创业网站可靠吗?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  表情包在线制作网站免费,表情包怎么弄?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何通过FTP服务器快速搭建网站?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  存储型VPS适合搭建中小型网站吗?  Python如何创建带属性的XML节点  建站之星ASP如何实现CMS高效搭建与安全管理?  在线制作视频网站免费,都有哪些好的动漫网站?  宝塔Windows建站如何避免显示默认IIS页面?  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何快速搭建高效WAP手机网站?  已有域名和空间如何快速搭建网站?  html制作网站的步骤有哪些,iapp如何添加网页?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  如何快速重置建站主机并恢复默认配置?  深圳网站制作平台,深圳市做网站好的公司有哪些?  建站之星伪静态规则如何正确配置?  西安专业网站制作公司有哪些,陕西省建行官方网站?  如何获取上海专业网站定制建站电话?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。