在 Linux 下,hlist
(哈希列表)是一种高效的数据结构,用于存储和检索数据
hlist_head
:#include<linux/list.h>
struct my_data {
int key;
int value;
struct hlist_node node;
};
struct hlist_head *my_hash_table;
int hash_table_size = 1024; // 哈希表大小,可以根据需要调整
my_hash_table = kcalloc(hash_table_size, sizeof(struct hlist_head), GFP_KERNEL);
if (!my_hash_table) {
printk(KERN_ERR "Failed to allocate memory for hash table\n");
return -ENOMEM;
}
static inline unsigned int my_hash_function(int key)
{
return (unsigned int)key & (hash_table_size - 1);
}
void add_to_hash_table(struct my_data *data)
{
unsigned int index = my_hash_function(data->key);
hlist_add_head(&data->node, &my_hash_table[index]);
}
void remove_from_hash_table(struct my_data *data)
{
hlist_del(&data->node);
}
struct my_data *find_in_hash_table(int key)
{
unsigned int index = my_hash_function(key);
struct my_data *data;
hlist_for_each_entry(data, &my_hash_table[index], node) {
if (data->key == key)
return data;
}
return NULL;
}
void traverse_hash_table(void)
{
int i;
struct my_data *data;
for (i = 0; i< hash_table_size; i++) {
hlist_for_each_entry(data, &my_hash_table[i], node) {
printk(KERN_INFO "Key: %d, Value: %d\n", data->key, data->value);
}
}
}
void free_hash_table(void)
{
int i;
struct my_data *data;
struct hlist_node *tmp;
for (i = 0; i< hash_table_size; i++) {
hlist_for_each_entry_safe(data, tmp, &my_hash_table[i], node) {
hlist_del(&data->node);
kfree(data);
}
}
kfree(my_hash_table);
}
通过这些基本操作,你可以在 Linux 下高效地使用 hlist
。请注意,这里的示例代码仅作为参考,实际应用时可能需要根据具体需求进行调整。