在 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
。請注意,這里的示例代碼僅作為參考,實際應用時可能需要根據具體需求進行調整。