C#本质论6.0第九章:良构类型

2021-07-05 07:17

阅读:601

标签:重写   字典   shc   这一   高效   情况   散列码   一点   数字   

重写object的成员:

重写HashCode():

散列码HashCode的作用是生成与对象值对应的数字,从而高效地平衡散列表。要获得良好的GetHashCode()实现,应按照以下实现原则:

  • 必须:
    • 相等的对象必然有相等的散列码。
    • 在特定对象的生存期内,GetHashCode()始终返回相同的值,即使对象的数据发生了改变。许多时候应缓存方法的返回值,从而确保这一点。
    • GetHashCode()不应引发任何异常,GetHashCode()总是成功返回一个值。
  • 性能:
    • GetHashCode()的性能应该优化,GetHashCode()通常在Equals()实现中用于“短路”一次完整的相等性比较,所以,当类型作为字典集合中的键类型使用时,会频繁的调用这个方法。
    • 可能的散列码值应当在int的范围内平均分布。
    • 两个对象的细微差异应造成散列码值的极大差异。理想情况下,一位的差异应造成散列码平均16位的差异。这有助于确保不管散列表如何对散列值进行“装桶”,也能保持良好的平衡性。
  • 安全:攻击者应该难以伪造具有特定散列码的对象。攻击的手法是向散列表中填写大量散列成同一个值的数据,如果散列表的实现不高效,就易于受到Dos攻击。

C#本质论6.0第九章:良构类型

标签:重写   字典   shc   这一   高效   情况   散列码   一点   数字   

原文地址:https://www.cnblogs.com/zhang-mo/p/9834072.html


评论


亲,登录后才可以留言!