写在前面:.NET中对象散列码好像是一个不大受理解的东西,一般情况下也没有怎么使用。所以很多程序员也不愿意地理解这个东西,如GetHashCode和Equals都与这个散列码相关。
每一个对象都有 GetHashCode方法,返回一个int类型,目的是为了生成一个与对象的值相对应的数字。
一般有如下的特点:
1,同类型的两个对象,如果是一样,他们的散列码是一定相同的。
2,散列函数(或哈希函数)要获得比较好的性能,并且生成的散列码分布要比较平均。
3,无论对象怎样调用或更新,哈希函数都必须返回同一个值。
利用上面的特点,有如下的用处
1, 为特定的数据结构提供分布服务,可以把不同的对象散列到不同的哈希桶中,其应用为Hashtable和Dictionary等。
2, 由于其分布比较平均,也常常被应用来产生随机数。
在.net中,Equals方法和GetHashCode方法必须成对出现,以确保相同的对象有相同的散列码值。
关于散列函数,专家Jeffrey Richter有如下的建议:
选择计算类型实例的散列码算法时,我们应该尽力遵循以下原则:
1、算法应该使所得的数值有一个良好的随机分布,这样散列表可以获得最佳的性能。
2、算法还可以调用基类型的GetHashCode方法,并将其返回值包含在我们的算法中。但在一般情况下,我们不应该调用Object或ValueType的GetHashCode方法,因为这两个类型的GetHashCode方法实现都不会获得高性能的散列算法。
3、算法应该至少使用一个实例字段。
4、理想情况下,我们在算法中使用的字段都应该是恒定不变的;也就是说在构造对象时字段被初始化后,它们就不应该再在对象的生存周期内有任何改变。
5、算法应该执行的尽可能快。
6、有着相同值的对象应该返回相同的散列码。例如,两个有着相同文本的String对象应该返回相同的散列码值。
出处:Chakman
添加到百度搜藏
添加到雅虎收藏