操作系统之哈希表操作系统之哈希表Linux内核应用浅析内核应用浅析
1.基本概念
散列表(Hash table。也叫哈希表)。是依据关键码值(Key value)而直接进行訪问的数据结构。
也就是说,它通过把关键码值映射到表中一个位置来訪问记录。以加快查找的速度。
这个映射函数叫做散列函数。存放记录的数组叫做散列表。
2. 经常使用的构造散列函数的方法
散列函数能使对一个数据序列的訪问过程更加迅速有效。通过散列函数。数据元素将被更快地定位。散列表的经常使用构造方
法有:
(1)直接定址法
(2)数字分析法
(3)平方取中法
(4)折叠法
(5)随机数法
(6)除留余数法
3、处理冲突的方法
散列表函数设计好的情况下,能够降低冲突,可是无法全然避免冲突。常见有冲突处理方法有:
(1)开放定址法
(2)再散列法
(3)链地址法(拉链法)
(4)建立一个公共溢出区
4. 散列表查找性能分析
散列表的查找过程基本上和造表过程同样。
一些关键码可通过散列函数转换的地址直接找到,还有一些关键码在散列函数得到的地址上产生了冲突,须要按处理冲突的方
法进行查找。
在介绍的三种处理冲突的方法中,产生冲突后的查找仍然是给定值与关键码进行比較的过程。所以,对散列表查找效率的量
度。依旧用平均查找长度来衡量。
查找过程中,关键码的比較次数。取决于产生冲突的多少,产生的冲突少,查找效率就高。产生的冲突多,查找效率就低。因
此,影响产生冲突多少的因素,也就是影响查找效率的因素。
影响产生冲突多少有下面三个因素:
1. 散列函数是否均匀;
2. 处理冲突的方法。
3. 散列表的装填因子。
散列表的装填因子定义为:α= 填入表中的元素个数 / 散列表的长度。
α是散列表装满程度的标志因子。因为表长是定值。α与“填入表中的元素个数”成正比,所以,α越大。填入表中的元素较多,
产生冲突的可能性就越大。α越小,填入表中的元素较少,产生冲突的可能性就越小。实际上,散列表的平均查找长度是装填
因子α的函数,仅仅是不同处理冲突的方法有不同的函数。
一.Linux内核哈希表数据结构
hash最重要的是选择适当的hash函数,从而平均的分配keyword在桶中的位置,从而优化查找 插入和删除所用的时间。然而
不论什么hash函数都会出现冲突问题。
内核採用的解决哈希冲突的方法是:拉链法拉链法解决冲突的做法是:将全部keyword为同义词的结点链接在同一个链表中。