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


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

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

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

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

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

  • 重写 Equals(object) 时,也应重写 Equals(T)(实现 IEquatable<t></t>)以提升性能
  • 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() 通常返回引用哈希,而非内容哈希,违背相等性契约。

FlowMuse AI FlowMuse AI

节点式AI视觉创作引擎

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

测试你的实现是否合理

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

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

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

以上就是C# GetHashCode()方法的重写规则 - 保证在字典和哈希表中正常工作的详细内容,更多请关注其它相关文章!


# 质数  # .net  # 重写  # 推荐使用  # 数据结构  # 加载  # 不应  # c#  # 劲松商城网站建设  # seo谷歌广告  # 北仑seo品牌优化  # 常州企业网站建设流程  # 推广营销新思路是什么  # 鹰潭建设网站  # 铜仁梵净山推广营销  # 青岛seo优化推广公司  # 如何优化网络seo  # 祁阳SEO  # 多个  # 随机数  # 这一  # 这是  # 如何实现 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: VS Code源代码管理(SCM)视图的进阶使用技巧  京东快递物流信息不更新怎么办_物流停滞原因与处理方法  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  谷歌邮箱官方入口链接 谷歌邮箱网页版电脑端快速登录  Linux如何优化系统启动流程_Linux启动项优化方案  win11讲述人怎么关闭 Win11屏幕朗读辅助功能禁用方法【技巧】  rabbitmq 持久化有什么缺点?  智学网成绩单查询系统网_智学网学生平台登录  mysql离线安装后如何启动_mysql离线安装完成后启动服务的方法  mysql中如何配置字符集和排序规则_mysql字符集排序配置  AI图层蒙版怎么用_AI图层蒙版应用技巧与设计实例  J*aScript桌面应用_Electron多进程架构实战  苹果手机聊天记录删除了如何恢复  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  12306售票时间最新规定 | 网上订票和车站窗口时间一样吗  MySQL多重关联查询:利用别名高效获取同一表的多个关联字段  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  歌词怎么展示在|直播|间视频号?有什么注意事项?  mysql怎么查询数据_mysql基础查询语句使用教程  微信步数怎么刷_微信步数快速提升技巧  b站怎么查看视频的码率_b站视频码率查看方法  芒果TV官网登录入口 芒果TV官方网站登录入口  4399造梦西游3无敌版_4399游戏入口  如何取消数字签名  如何通过settings.json个性化您的VS Code体验  PDF文件去水印平台入口 PDF水印删除网址  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  使用逻辑应用(Logic Apps)自动处理邮件附件中的XML到Excel  江苏大剧院会员卡购买步骤  《海底捞》点外卖方法  Sublime Text怎么关闭自动完成_Sublime禁用Auto Complete设置  《异星探险家》古怪的物品作用介绍  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  CodeIgniter 3 中基于 MySQL 数据高效生成动态图表教程  手机耗电快是什么原因 延长手机电池续航时间的设置方法【详解】  《密马》发布账号方法  汽水音乐官方网站登录入口_汽水音乐网页版进入链接  百度识图图像分析 百度识图识别平台  吃完饭就犯困是什么原因 餐后嗜睡如何缓解  126手机126邮箱登录_126邮箱手机登录入口官网  红手指专业版app注册教程  WPS文字如何进行简繁转换  AO3官方镜像链接 | 最新防走失网址永久收藏  原子笔记app误删找回教程  西瓜视频怎么查看访客记录_西瓜视频访客记录查看方法  使用 .htaccess 正确配置 WordPress 子目录重定向与路径保留  微信客户端如何找回密码_微信客户端忘记密码找回方法  《咸鱼之王》新版孙坚技能解析  Go App Engine 项目结构与包管理深度指南  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】 

 2025-12-18

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.