一、Hash表简介
- 哈希表(Hash table)又叫散列表,是根据(Key, Value) 键值对进行访问的数据结构。主要目的是提高查询效率,比如Hash表的order为5,也就是同时使用
2^5个链表,理论上查询速度可以比链表快2^ 5倍,典型的以空间换时间。 - 主要实现在 include/linux/hashtable.h 中,基于hlist。
- 在 Linux 内核中,Hash Table 和 RCU 是经常一起使用的。Hash Table 主要用于快速查找元素,而 RCU 用于读操作的并发保护,以便多个线程能够同时访问 Hash Table。
- 使用 Hash Table 时,需要特别注意并发读写的正确性,以避免数据不一致等问题。使用 RCU 可以有效地提高 Hash Table 的并发读取性能,并减少锁竞争。
二、相关结构
/* include/linux/types.h */
/*哈希表表头结构*/
struct hlist_head {
struct hlist_node *first; //指向头结点的指针
};
/*结点结构*/
struct hlist_node {
struct hlist_node *next, **pprev;
// next指向下一结点的指针,pprev指向上一结点next指针的指针
};
使用二级指针 **pprev 可以使在删除节点上的处理变的简单,无需关心是否是head节点。而单链表或双向链表使用 *prev 成员需要单独判断是否是head节点。
三、相关函数
3.1 定义Hash表
/* Hash表的表头就是一个数组,数组中每一个原生都是一个链表 */
#define DECLARE_HASHTABLE(name, bits) \
struct hlist_head name[1 << (bits)]
/* 定义并初始化 */
#define DEFINE_HASHTABLE(name, bits) \
struct hlist_head name[1 << (bits)] = \
{
[0 ... ((1 << (bits)) - 1)] = HLIST_HEAD_INIT }
3.2 Hash表初始化
/* 初始化Hash表 */
#define hash_init(hashtable) __hash_init(hashtable, HASH_SIZE(hashtable))
static


2万+

被折叠的 条评论
为什么被折叠?



