我试图了解linux内核的哈希表的实现。我不明白的是,我发现代码初始化只有一个哈希桶的哈希表。我不知道为什么编码会这样做。
这个哈希表用法对我有意义:
在kernel/pid.c
:
void __init pidhash_init(void)
{
unsigned int i, pidhash_size;
pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,
HASH_EARLY | HASH_SMALL,
&pidhash_shift, NULL,
0, 4096);
pidhash_size = 1U << pidhash_shift;
for (i = 0; i < pidhash_size; i++)
INIT_HLIST_HEAD(&pid_hash[i]);
}
pid_hash
是struct hlist_head
的列表,因此列表中的每个条目都代表一个哈希桶。
然而,这种用法对我没有意义:
在drivers/android/binder.c
金鱼分支中:
static HLIST_HEAD(binder_dead_nodes);
它扩展到
struct hlist_head name = { .first = NULL }
基本上它是一个只有一个hlist_head
的哈希表,即只有一个哈希桶的哈希表。所以它实际上是一个双链表。为什么人们想用这样的哈希桶创建一个哈希表呢?
答案 0 :(得分:3)
hlist
只是一个常规的双重链表。
list
和hlist
之间的区别仅在于hlist
交易O(1)访问列表尾部,以便为空列表减少50%的内存。这对于哈希表来说是完美的,哈希表有很多空列表,从不需要反向或从后面访问列表。
但是,它对于常规链接列表也很有用。
通过使用hlist
,他们在list
上保存了几个字节,并向我们发出了一个强烈的信号,表明该列表用于收集未知数量的项目,其顺序并不重要