HashTable或者Dictionary是两个我们常用的数据结构。提供了一种键值对应的数据访问方式,其有别于Array采用下标的方式检索数据。了解其内部的实现机制有助于我们写出更优秀的程序。
.NET中的HashTable(Dictionary将不做详细描述,算法实现于HashTable一样,只是加上了对范形的支持)采用双哈希(二次哈希)的算法。这里对二次哈希作一个简单介绍。在数据结构的课本中,我们知道哈希表是会出现冲突的,而处理冲突的方法有:1、开放地址法,简单的说就是如果出现冲突就找数组中的下一个位置,此方法是最简单的处理冲突的方法;2、再哈希法,就是在同义词产生地址冲突时计算另一个哈希函数地址,直到冲突不再发生,这里需要定义n个哈希函数;3、链地址法,即每一个储存位置都为一个链表;4、建立一个公共溢出区。.NET中的二次哈希是再哈希法的一个简化,其只定义两个哈希函数h1,h2。h1使用的是每个类的GetHashCode方法,h2的定义为:incr = 1+(((seed>>5)+1)%(hashsize-1))),其中,seed为第一次Hash的值,HashSize为整个表的大小。当冲突时,在seed的基础上加incr。如下代码:
uint
seed;
uint incr;
// Assume we only have one thread writing concurrently. Modify
uint incr;
// Assume we only have one thread writing concurrently. Modify