一、数据结构:
HashPrime:是一个固定的素数;
InitialSize :是哈希表的默认容量; count :记录哈希表中的元素总数; occupancy: 记录哈希表发生冲突的次数; loadsize: 装载容量值,相当于一个阈值,达到了这个数值,将对哈希表进行扩容; loadFactor: 哈希表中的元素占有数据桶空间的一个比率,这个比例直接决定了哈希表在什么时候进行扩容; buckets:称为数据桶,用于存储哈希表中的元素,它是一个结构体,包含:1. key:键,键是不能重复的;
2. val:值,可以是任何的类型(想要类型安全可以选择Dictionary,是Hashtable的泛型实现);
3. hash_col:是一个Int32类型,它的最高位是符号位,为“0”时,表示这是一个正整数;为“1”时表示负整数。hash_coll使用最高位表示当前位置是否发生冲突,正数表示未发生冲突;负数表示当前位置存在冲突。之所以专门使用一个位用于存放哈希码并标注是否发生冲突,主要是为了提高哈希表的运行效率。
二、冲突处理方法
通常用于处理冲突的方法有:开放定址法(线性探测,二次探测,伪随机探测)、再哈希法、链地址法、建立一个公共溢出区等。
Dictionary使用的解决冲突方法是拉链法,又称链地址法
Hashtable使用双重散列法解决冲突 (说明:对于线性探测法,当聚焦问题严重或者表接近满时,要搜索一个关键字,往往要逐个检查很多个无关项(先于和搜索关键字匹配的元素插入)。为了解决聚焦问题,提出了双重散列算法,其基本策略和线性探测法一项,唯一不同是:它不是检查冲突位置后的每一个位置,而是采用另一个散列函数产生一个固定的增量。(跳跃式检查和插入,减小聚焦大小))