算法总结-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表中的元素个数。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HASH_FIND_INT函数是一个用于在哈希表中查找指定键的函数。它的第一个参数是哈希表,第二个参数是键的地址,第三个参数是输出变量。如果存在该键,函数会将所在的哈希桶地址赋值给输出变量,并返回该地址;如果不存在该键,则返回NULL。该函数的作用是查找键所在的结构指针。\[1\] 在使用HASH_FIND_INT函数时,需要注意传递键的地址作为参数。另外,返回值为结构体指针,方便获取目标键对应的实际值。\[1\] 除了HASH_FIND_INT函数,还有其他类型的键可以使用不同的宏定义,如HASH_ADD_KEYPTR、HASH_ADD_STR、HASH_ADD_PTR、HASH_FIND_PTR等。\[2\] 在头文件"uthash.h"中已经提供了哈希表的库函数,只需要学习其用法即可。可以定义一个结构体来表示哈希表的键值对,并使用UT_hash_handle宏定义一个哈希表的句柄。在使用哈希表之前,需要将句柄初始化为空。可以通过find函数来查找指定键的结构指针,通过insert函数来插入键值对。\[3\] 总结来说,HASH_FIND_INT函数是用于在哈希表中查找指定键的函数,需要传递键的地址作为参数,并返回键所在的结构指针。在使用哈希表时,需要注意使用正确的宏定义和初始化哈希表的句柄。 #### 引用[.reference_title] - *1* [哈希库--uthash的详细讲解(附uthash相关头文件下载)](https://blog.csdn.net/navylhjjlh/article/details/124135815)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言哈希表用法](https://blog.csdn.net/nameofcsdn/article/details/107297361)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C语言库函数的哈希表使用方法](https://blog.csdn.net/qq_43599515/article/details/124169271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值