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相等
posted @ 2011-05-31 18:59  再快一点  阅读(293)  评论(0编辑  收藏  举报