Hashtable的实现原理

本文深入探讨哈希表的数据结构及其工作原理,包括哈希表的插入与查找操作,并详细解析Hashtable的具体实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从狭义上来看, 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:返回一个增加的值,降低重复的可能性。

 

 

 

转载于:https://www.cnblogs.com/longtime/p/3764297.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值