头文件: uthash.h
1.定义(key为int型)
struct hashTable{
int key;
int val;
UT_hash_handle hh; //必须要写上
}
2.声明
其次需要声明一个结构体指针hashtable,并初始化为空指针,它指向储存数据的hash表。
struct hashTable* hashtable= NULL;
3.查找item(key为int型)
HASH_FIND_INT(hashtable, &ikey, tmp);
第一个参数是之前定义过的指向hash表的指针hashtable;
第二个参数是要查找的键值的地址;
第三个参数返回查找结果的一个指针,在查找前定义为空即可:struct hashTable* tmp;
注: key是int,使用INT; key是字符串,使用STR; key是指针,使用PTR 。
一个例子:
struct my_struct *find_user(int ikey)
{
struct my_struct *s;
HASH_FIND_INT(hashtable, &ikey, s);
return s;
}
4.添加item(key为int型)
HASH_ADD_INT(hashtable, key, tmp);
第一个参数是之前定义过的指向hash表的指针hashtable;
第三个参数是要添加的结构的指针tmp,需要对其申请内存和赋值:
tmp = malloc(sizeof(struct hashTable));
tmp->key = ikey;
tmp->val = i;
第二个参数是tmp的key。
下面是使用了添加和查找的一个例子,在添加前,必须先确保tmp的key值不在hashtable当中。
void insert(int ikey) {//传入一个字符串
struct hashTable* tmp;
HASH_FIND_INT(hashtable, &ikey, tmp);//查找键值key是否已经出现在hashtable里
if (tmp != NULL) {
tmp->val = -1;
} else {
tmp = (struct hashTable*)malloc(sizeof(struct hashTable));
tmp->key = ikey;
tmp->val = 1;
HASH_ADD_INT(hashtable, key, tmp);//在key字段处插入tmp
}
5.迭代hash
可以通过hh.next指针遍历hash表中所有items
struct hashTable*s;
for(s=hashtable; s != NULL; s=s->hh.next){
printf("user id %d: name %s\n", s->id, s->name);
}
这种for用法并不安全,因为s是临时变量,每次遍历都会改变,所以需要再定义一个临时变量用于保存s->hh.next取到的item,可以简化为下面这种方法:
struct hashTable*s, *tmp;
HASH_ITER(hh, hashtable, s, tmp) {
printf("user id %d: name %s\n", s->id, s->name);
}
注:具体参数作用可以比对第一种for用法进行理解。
6.删除
HASH_DEL(hashtable, tmp);
第一个参数是哈希表,第二个参数是指向要删除的结构体指针。
例子:
void delete_user(struct hashTable *tmp)
{
HASH_DEL(hashtable, tmp);
free(tmp); /* 需要自己手动释放结构体tmp的内存 */
}