Bootstrap

算法总结-UT哈希算法

​uthash 是C实现的哈希算法开源代码,它实现了常见的hash操作函数,例如查找、插入、删除等。uthash 采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构作为key值,甚至可以采用多个值作为key,无论是自定义的struct还是基本数据类型。需要注意的是不同类型的key其操作接口方式略有不同

由于uthash 采用宏的方式实现,所有的实现代码都在uthash.h文件中,因此使用时只需要包含该头文件即可。

uthash最常用的无非HASH_FIND_INT、HASH_ADD_INT、HASH_DEL等几个接口,掌握了这几个接口的使用足以应付大部分的hash应用场景。下面从几个函数入手来讲解uthash的使用。.

1、hash结构体

使用uthash需要先定义一个结构体,如下:

typedef struct HASH {
    int key;
    int value;
    UT_hash_handle hh;
} hash_t;

其中key值是哈希表的键值,hh是内部使用的hash处理句柄,在使用过程中,只需要在结构体中定义一个UT_hash_handle类型的变量即可,不需要为该句柄变量赋值,但必须在该结构体中定义该变量。

2、HASH_FIND_INT

HASH_FIND_INT用来查找key值是否在hash表中。用法见下面。

3、HASH_ADD_INT

hash_t *g_head = NULL;
void hash_add() {
    int key = 0;
    hash_t * node = (hash_t *)malloc(sizeof(hash_t));
    node->cnt = 1;  // 注意此处的初始化值
    node->key = 0;
    HASH_FIND_INT(g_head, &sum, node);  //在hash表中查找sum是否存在,此时sum即为键值
    if (node != NULL) {
        node->value++;
    } else {
        node = (hash_t *)malloc(sizeof(hash_t));
        node->key = sum;
        node->cnt = 1;
        HASH_ADD_INT(g_head, key, node); // 第二个参数为hash结构体里面key值的变量名
    }

}

​由于uthash要求键(key)必须唯一,而uthash内部未对key值得唯一性进行很好的处理,因此它要求外部在进行插入操作时要确保其key值不在当前的hash表中。若插入相同的key值到一个hash中,会被当做一种错误。

4、HASH_COUNT

int count = HASH_COUNT(g_head);

HASH_COUNT用来统计hash表中的元素个数。

;