如何使用uthash的HASH_FIND函数实现哈希表取值功能?
使用uthash时HASH_FIND中hh参数的说明与示例
问题描述
大学作业要求用uthash库实现带新增、查询、删除功能的哈希表,结构体定义如下:
typedef struct hashtable { unsigned char *key; size_t k_len; unsigned char *value; size_t v_len; UT_hash_handle hashhandle; } hashtable;给定查询函数头:
hashtable* get_value(hashtable **ht, const unsigned char *key, size_t key_len);需要用uthash的
HASH_FIND函数按key查找值,已知该函数参数为HASH_FIND(hh, head, keyptr, keylen, out),对keyptr、keylen、head、out的用法基本清楚,但不清楚hh(即hash_handle)的具体含义,是否需要从结构体中取出对应的hashhandle传入?
关于hh参数的说明
hh参数本质是结构体中UT_hash_handle成员的名称,不是要传入某个具体实例的成员变量,直接写成员名即可。- uthash通过这个参数定位结构体中维护哈希表的内部控制块,不需要手动取出某个实例的
hashhandle传入,只需要写成员的标识符hashhandle。
正确的查询函数实现示例
结合你的结构体和函数头,get_value的正确实现如下:
hashtable* get_value(hashtable **ht, const unsigned char *key, size_t key_len) { hashtable *result = NULL; // 直接传入结构体中UT_hash_handle成员的名称:hashhandle HASH_FIND(hh, *ht, key, key_len, result); return result; }
补充说明
- uthash的所有操作宏(如
HASH_FIND、HASH_ADD等)都通过成员名称关联结构体内部的哈希控制信息,因此宏里的hh参数,始终对应你结构体中UT_hash_handle成员的名字。如果你的成员命名为hh,那宏里就写hh;如果命名为hash_handle,就写hash_handle。
内容的提问来源于stack exchange,提问作者slayze
相关产品推荐
相关产品推荐

