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相等
  • 相关阅读:
    写在vue总结之前(一)
    前端应该掌握的web基础和网络知识
    sass之为什么要使用预处理器
    ThinkPHP简单的验证码实现
    ajax接收php返回得到一堆html代码
    Bootstrap 4,“未捕获错误:Bootstrap工具提示需要Tether(http://github.hubspot.com/tether/)”
    百度AI开放平台- API实战调用
    最短路径算法—Dijkstra(迪杰斯特拉)算法分析与实现(C/C++)
    C#避免踩坑之如何添加paint事件
    php插入mysql中文数据出现乱码
  • 原文地址:https://www.cnblogs.com/mxw09/p/2065017.html
Copyright © 2011-2022 走看看