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相等
  • 相关阅读:
    other备忘
    Mdoelsim10.4怎么脚本单独仿真ISE14.7 IP核
    Vivado怎么使用In system debug(类似于chipscope的东西)
    Vivado如何使用bat脚本一键创建工程
    Vivado中VIO核使用
    FPGA上外挂DDR2&DDR3&MIG IP的使用记录
    Vivado2016旧工程IP移动到新工程
    怎样在ISE14.7中固化FLASH文件
    Quartus13.1全编译出现引脚错误(神级bug)
    自用windows小软件
  • 原文地址:https://www.cnblogs.com/mxw09/p/2065017.html
Copyright © 2011-2022 走看看