从狭义上来看, Hashtable 可以是一种具体类型名称:System.Collections.Hashtable ,从广义上来看, 它指的是一种数据结构, 即哈希表, 牵涉了多种具体类型, 像 HashMap, Dictionary 等等, 都属于哈希表的范畴。hashtable的具体类型为System.Collections.DictionaryEntry
打开反编译器,Hashtable通过一个结构体bucket来表示其中的单个元素
private struct bucket { public object key; public object val; public int hash_coll; }
Key:键
Val:Key所对应的值
hash_coll:key所对应的哈希码
uint num3 = this.InitHash(key, this.buckets.Length,out num ,out num2);
这个num3 即hash_coll值
hashtable中Add方法排序并非随意排序
public virtual void Add(object key,object value) { this.Insert(key,value,true) }
打开insert
uint num3 = this.InitHash(key, this.buckets.Length,out num ,out num2); int num4 = 0; int index = -1; int num 6 = (int)(num %this.buckets.Length);
num3即为hash_coll值
num6则是存储数组数据的位置
this.buckets[num6].val = nvalue; this.buckets[num6].key = key; this.buckets[num6].hash_coll|=(int) num3;
是通过num对当前数组的长度来求余,确定数据存放的位置。hashtable的数据存储在buket数组中,这个数组需要存储三个值。通过key计算出一个hashcode值,用这个值与当前数组的长度做求余运算,得出一个索引下标,将数据存储到这个下标位置。
取值的时候不需要通过遍历,儿是直接通过对象中存储hash_coll值计算出下表,显著提高效率。
一个变量分配地址通过对象当前的hash_code来分配
而在InitHash中有这样一句
uint num = (uint)(this.GetHash(key)& 0x7fffffff);
系统通过优化,尽可能找到不是重复的值,不同的数据在算完之后值可能是一样的,通过key值来运算,返回num值。
num2:返回一个增加的值,降低重复的可能性。