码迷,mamicode.com
首页 > 其他好文 > 详细

Hashtable的实现原理

时间:2014-06-02 14:54:36      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:c   style   class   blog   code   java   

从狭义上来看, Hashtable 可以是一种具体类型名称:System.Collections.Hashtable ,从广义上来看, 它指的是一种数据结构, 即哈希表, 牵涉了多种具体类型, 像 HashMap, Dictionary 等等, 都属于哈希表的范畴。hashtable的具体类型为System.Collections.DictionaryEntry

打开反编译器,Hashtable通过一个结构体bucket来表示其中的单个元素

bubuko.com,布布扣
private struct bucket
{
    public object key;
    public object val;
    public int hash_coll;
}
bubuko.com,布布扣

Key:键

Val:Key所对应的值

hash_coll:key所对应的哈希码

bubuko.com,布布扣
uint num3 = this.InitHash(key, this.buckets.Length,out num ,out num2);
bubuko.com,布布扣

这个num3 即hash_coll值

hashtable中Add方法排序并非随意排序

bubuko.com,布布扣
public virtual void Add(object key,object value)
{
    this.Insert(key,value,true)
}
bubuko.com,布布扣

打开insert

bubuko.com,布布扣
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);
bubuko.com,布布扣

num3即为hash_coll值

num6则是存储数组数据的位置

bubuko.com,布布扣
this.buckets[num6].val = nvalue;
this.buckets[num6].key = key;
this.buckets[num6].hash_coll|=(int) num3;
bubuko.com,布布扣

是通过num对当前数组的长度来求余,确定数据存放的位置。hashtable的数据存储在buket数组中,这个数组需要存储三个值。通过key计算出一个hashcode值,用这个值与当前数组的长度做求余运算,得出一个索引下标,将数据存储到这个下标位置。

取值的时候不需要通过遍历,儿是直接通过对象中存储hash_coll值计算出下表,显著提高效率。

一个变量分配地址通过对象当前的hash_code来分配

而在InitHash中有这样一句

1
uint num = (uint)(this.GetHash(key)& 0x7fffffff);

 系统通过优化,尽可能找到不是重复的值,不同的数据在算完之后值可能是一样的,通过key值来运算,返回num值。

num2:返回一个增加的值,降低重复的可能性。

 

 

 

Hashtable的实现原理,布布扣,bubuko.com

Hashtable的实现原理

标签:c   style   class   blog   code   java   

原文地址:http://www.cnblogs.com/longtime/p/3764297.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!