zoukankan      html  css  js  c++  java
  • GeHashCode与哈希算法

    GeHashCode三原则:
    1. 如果两个对象相等(由operator==定义),它们必须产生相同的散列码。否则,这样的散列码不能用来查找容器中的对象。
    2. 对于任何一个对象A,A.GetHashCode()必须是一个实例不变式(invariant)。即不管在A上调用什么方法,A.GetHashCode()都必须总是返回相同

    的值。这可以确保放在“散列桶”中的对象总是位于正确的“散列桶”中。
    3. 对于所有的输入,散列函数应该在所有整数中产生一个随机的分布。这样,我们才能从一个散列容器上获得效率的提升。

    Object.GetHashCode满足原则1和原则2,在哈希表(Hashtable,Dictionary)使用不会有问题
    ValueType.GetHashCode不100%满足原则1,原则2,原则3,在哈希表(Hashtable,Dictionary)使用可能会有问题

    测试环境 .Net Framwwork2.0(没有打SP补丁),vs2005
    证明:
    1.如果两个值类型实体既有值类型字段也有引用类型字段且第一个字段的gethashcode相等,则这两个实体的哈希码相等
    2.如果两个值类型实体的仅有一个字段且那一个字符的gethashcode相等,则这两个实体的哈希码相等
    3.如果两个值类型实体的全都只包含整型,浮点型,或者枚举字段(不包含decimal,bool以及自定义结构类型)且所有字段的gethashcode相等,则
    这两个实体的哈希码相等
    4.如果两个值类型实体的全都只包含引用类型字段且第一个字段的gethashcode相等,则这两个实体的哈希码相等

    总结:
    假设有一个结构体StructTest
    StructTest有两个实例 s1,s2
    1.当一个StructTest包含多个字段,且每个字段都是整型(char除外),浮点型,或者枚举。那么当且仅当s1和s2的每个字段的GetHashCode相等,s1.GetHashCode才与s2.GetHashCode相等
    2.否则如果s1和s2的第一个字段的GetHashCode相等,s1.GetHashCode与s2.GetHashCode相等
  • 相关阅读:
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
    Spring Boot进阶系列一
    职场进阶之七种武器
    大龄IT程序员的救赎之道
    Web Service
    生产者消费者问题
    SpringBoot集成Apache Shiro
    简单模拟医院叫号系统
    IT小团队管理者的突围之道
    内部推荐
  • 原文地址:https://www.cnblogs.com/mxw09/p/2065017.html
Copyright © 2011-2022 走看看