我使用了一些标识类/结构,这些类/结构包含1-2个ints,可能还包含日期时间或一个小字符串。我在字典里用这些作为钥匙。
对于这样的事情,什么是GetHashCode的好的重写呢?一些相当简单但仍有希望的表演。
谢谢
发布于 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()实现短路,如果哈希码不同,则完全等于比较。因此,当将该类型用作字典集合中的键类型时,经常会调用该类型。如前所述,您还必须考虑一些关于重写Equals()的要点,还有一些代码示例展示了如何实现这两个函数。
因此,这些信息应该给出一个起点,但我建议购买这本书,并阅读完整的第9章(至少前十二页),以获得关于如何正确实现这两个关键功能的所有要点。
https://stackoverflow.com/questions/3204155
复制相似问题