首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适合小班的哈希?(覆盖GetHashCode)

适合小班的哈希?(覆盖GetHashCode)
EN

Stack Overflow用户
提问于 2010-07-08 13:40:44
回答 1查看 1.5K关注 0票数 4

我使用了一些标识类/结构,这些类/结构包含1-2个ints,可能还包含日期时间或一个小字符串。我在字典里用这些作为钥匙。

对于这样的事情,什么是GetHashCode的好的重写呢?一些相当简单但仍有希望的表演。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2010-07-08 13:46:25

看看本质C#

它包含关于如何正确覆盖GetHashCode()的详细说明。

这本书的摘录

哈希代码的目的是通过生成一个与对象值相对应的数字来有效地平衡哈希表。

  • 必需:相等的对象必须有相同的哈希码(如果是a.Equals(b),那么是a.GetHashCode() == b.GetHashCode())
  • 必需:即使对象的数据发生变化,GetHashCode()在特定对象生命周期内的返回值应该是常量(相同的值)。在许多情况下,您应该缓存方法返回以强制执行。
  • 必需:GetHashCode()不应抛出任何异常;GetHashCode()必须始终成功地返回值。
  • 性能:在可能的情况下,哈希代码应该是唯一的。但是,由于哈希代码只返回一个int,所以对于具有可能比int所能容纳的值更大的对象,哈希代码必须有重叠--几乎所有类型。(一个明显的例子是long,因为long值比int唯一识别的值更多。)
  • 性能:可能的哈希代码值应该在int的范围内均匀分布。例如,创建一个不考虑这样一个事实的哈希,即在基于拉丁语的语言中,字符串的分布主要集中在最初的128个ASCII字符上,这将导致字符串值的分布非常不均匀,而不是一个强大的GetHashCode()算法。
  • 性能:应该对GetHashCode()进行性能优化。GetHashCode()通常用于Equals()实现短路,如果哈希码不同,则完全等于比较。因此,当将该类型用作字典集合中的键类型时,经常会调用该类型。
  • 性能:两个对象之间的微小差异应该会导致哈希代码值之间的巨大差异--理想情况下,对象中的1位差异会导致大约16位哈希代码的平均变化。这有助于确保哈希表保持平衡,无论它是如何“对”哈希值进行“逆序”处理。
  • 安全性:攻击者很难创建具有特定哈希代码的对象。攻击是用大量的数据淹没哈希表,这些数据都是哈希值相同的。然后哈希表实现变成O(n)而不是O(1),从而导致可能的拒绝服务攻击。

如前所述,您还必须考虑一些关于重写Equals()的要点,还有一些代码示例展示了如何实现这两个函数。

因此,这些信息应该给出一个起点,但我建议购买这本书,并阅读完整的第9章(至少前十二页),以获得关于如何正确实现这两个关键功能的所有要点。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3204155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档