uthash哈希库使用详解(增删改查和遍历,示例代码)

news/2024/10/18 18:29:39/

C语言中,标准库并没有提供哈希表的实现,因此很多开发者需要自己实现哈希表,这通常是一个复杂且容易出错的过程。幸运的是,有像uthash这样的开源库可以帮助我们简化这一过程。本文将对uthash的使用进行详尽的讲解,包括增加、删除、查找、遍历、计算哈希元素个数以及哈希元素排序等操作。

哈希表是一种常用的数据结构,它提供了快速的插入、查找和删除操作,使得在大量数据中进行高效的检索成为可能。在C语言中,使用uthash库可以轻松地实现哈希表,本文将介绍uthash库的用法、原理和一些示例。

哈希库头文件下载

首先,如果你还没有uthash的头文件,可以通过以下链接下载:

  • 链接:夸克网盘分享
  • 私有仓库记录:https://gitee.com/kiss_plasma/mycode/tree/master/2.utHash(c%E8%AF%AD%E8%A8%80%E4%BE%8B%E7%A8%8B)

什么是uthash库?

uthash库是一个在C语言中实现的轻量级哈希表库,它提供了高效的哈希表数据结构和简单易用的API,能够快速地将对象插入到哈希表中,并支持快速的查找、删除等操作。uthash库的特点包括:

  • 简单易用:uthash库提供了简洁的API,使用方便。
  • 高效性能:底层实现采用了高效的算法>哈希算法和数据结构,能够在大量数据中快速进行操作。
  • 灵活性:可以轻松地在任何C语言项目中使用,而无需额外的依赖。

原理

uthash库的原理是基于开放地址哈希表实现的。它采用了MurmurHash算法来生成哈希值,并使用线性探测法解决哈希冲突。在插入元素时,它会计算元素的哈希值,并根据哈希值找到对应的槽位,如果槽位已经被占用,就会线性探测直到找到空闲的槽位为止。在查找元素时,它会根据元素的哈希值找到对应的槽位,然后在该槽位以及之后的槽位中查找目标元素,直到找到或者遇到空槽为止。

示例应用

uthash库可以用于各种场景,例如:

  • 缓存:将数据存储在哈希表中,以快速访问。
  • 符号表:在编译器中用于存储变量、函数等符号信息。
  • 数据库索引:在数据库系统中用于加速查询操作。

哈希表基础 

哈希表结构体

在uthash中,哈希表的每个元素都是一个结构体,通常包含以下几个部分:

  • key:哈希表的键。

  • value:与键相关联的值。

  • UT_hash_handle hh:一个内部使用的句柄,用于uthash内部的内存管理,用户不需要手动赋值。

增加元素

uthash提供了多种增加元素的宏,根据键的类型不同,可以分为:

  1. HASH_ADD_INT:键为整数类型。

  2. HASH_ADD_STR:键为字符串类型。

  3. HASH_ADD_PTR:键为指针类型。

  4. HASH_ADD:键为任意类型。

HASH_ADD_INT为例,其使用方式如下:

HASH_ADD_INT(hash, key, item);
  • hash:哈希表。

  • key:键的字段名。

  • item:指向要添加元素的指针。

在添加之前,uthash会使用HASH_FIND_INT检查键是否已存在,以避免重复。

查找元素

查找操作与增加操作类似,也根据键的类型有不同的宏:

  • HASH_FIND_INT:查找整数键。

  • HASH_FIND_STR:查找字符串键。

  • HASH_FIND_PTR:查找指针键。

使用方式如下:

HASH_FIND_INT(hash, key, item);

如果找到,item将指向对应的元素;如果没有找到,item将为NULL

删除元素

删除操作需要传入要删除元素的地址:

HASH_DEL(hash, item);

这里的item是指向要删除元素的指针。

排序

uthash允许对哈希表中的元素进行排序,使用HASH_SORT宏:

HASH_SORT(hash, compare_function);

这里的compare_function是一个比较函数,其工作原理与qsort的标准比较函数类似。

遍历

使用普通的for循环可以遍历哈希表中的所有元素:

for (item = hash; item != NULL; item = item->hh.next) {// 处理item
}

循环删除

uthash提供了HASH_ITER宏,可以方便地在循环中删除元素:

HASH_ITER(hh, hash, item, tmp) {// 在这里处理item// 删除操作
}

这里的hh是一个句柄,hash是哈希表,itemtmp是用于遍历的指针。

计算哈希表元素个数

uthash还提供了一个简单的宏来计算哈希表中的元素个数:

size_t num_items = HASH_COUNT(hash);

使用uthash库

使用uthash库非常简单,只需要将uthash.h头文件包含到你的项目中,并定义一个结构体,其中包含一个UTHASH的宏。下面是一个简单的例子:

#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"// 定义一个结构体
typedef struct {int id;char name[20];UT_hash_handle hh; // 用于指示哈希表中的链接字段
} User;User *users = NULL;int main() {// 创建并插入元素User *user = (User*)malloc(sizeof(User));user->id = 1;strcpy(user->name, "John");HASH_ADD_INT(users, id, user);// 查找元素User *found_user;int search_id = 1;HASH_FIND_INT(users, &search_id, found_user);if (found_user != NULL) {printf("Found user with ID %d: %s\n", found_user->id, found_user->name);} else {printf("User with ID %d not found\n", search_id);}// 删除元素HASH_DEL(users, found_user);free(found_user);return 0;
}

在这个示例中,我们定义了一个User结构体,并使用UTHASH的宏UT_hash_handle定义了哈希表中的链接字段。然后,我们可以使用HASH_ADD_INTHASH_FIND_INT等宏来插入和查找元素。 

结语

uthash是一个功能强大的哈希库,可以帮助C语言开发者轻松实现哈希表的各种操作。本文提供了uthash的基本使用教程,希望对你有所帮助。如果你有任何疑问或建议,欢迎提出。


http://www.ppmy.cn/news/1432225.html

相关文章

开发语言漫谈-脚本语言

前面讲的都称之为编程语言&#xff0c;就是做系统用的。还有一大类称之为脚本语言的语言&#xff0c;这类语言数量极多&#xff0c;大部分程序员用不上&#xff0c;也不关心&#xff0c;这是系统维护人员专用的邻域。这个定义其实也很不准确&#xff0c;不必较真。更准确的来讲…

傅立叶变换与拉普拉斯变换的区别与联系?

傅里叶变换和拉普拉斯变换都是信号处理中的重要工具&#xff0c;它们有以下几个主要区别&#xff1a; 定义域&#xff1a;傅里叶变换是在频率域&#xff08;即虚轴&#xff09;上定义的&#xff0c;而拉普拉斯变换在复平面上的特定区域内定义。 适用范围&#xff1a;傅里叶变换…

Ubuntu22.04 + ROS2 Humble配置Moveit2环境

Ubuntu22.04 ROS2 Humble配置Moveit2环境 文章目录 Ubuntu22.04 ROS2 Humble配置Moveit2环境1.Ubuntu22.04配置ROS22.二进制安装Moveit23.配置Moveit的官方教程3.1安装rosdep3.2下载moveit的tutorials3.3安装中间件Middleware 4.启动测试用例Reference 环境配置&#xff1a; …

keytool证书工具详解(二)

JDK自带的keytool证书工具详解 一、生成证书 keytool -genkey -alias tomcat -keyalg RSA -keystore D:/tomcat.keystore -keypass 123456 -storepass 123456 -dname "CN=xingming,OU=danwei,O=zuzhi,L=shi,ST=sheng,C=CN" keytool -genkey -alias tomcat -keyalg …

Oracle删除数据库的步骤【谨慎操作】

在创建数据库的时候,有创建就会有删除,删除数据库的工作需要很多必要的条件 删除数据库会把所有库的数据文件、控制文件、日志文件等物理文件通通给删除掉!!!! 这时候你就可以跑路了。。。。。 1、模拟测试,创建一个测试库 -- 创建临时表空间 [root@cdp1 sql]#cat /d…

聚道云一键打通金蝶宁波银行,财务效率暴涨10倍!

客户介绍&#xff1a; 某农资有限公司是一家集农资贸易、仓储物流、农机服务为一体的大型企业。随着业务规模的不断扩大&#xff0c;传统的手动财务操作模式已难以满足其需求。公司急需寻找一种方法&#xff0c;将金蝶财务软件与宁波银行对接&#xff0c;实现资金流转自动化和…

24V转2.8V2A降压芯片WT6030

24V转2.8V2A降压芯片WT6030 WT6030是一种高效同步整流降压开关模式转换器&#xff0c;集成内部功率MOSFET。该器件在宽输入电源范围内提供3A峰值输出电流&#xff0c;展现出卓越的负载和线路调节性能。其设计仅需要最小数量的外部现成组件&#xff0c;并且采用了节省空间的ESO…

Web3革命:区块链如何重塑互联网

引言 互联网的发展已经深刻地改变了我们的生活方式&#xff0c;而现在&#xff0c;Web3和区块链技术正在为我们提供一个全新的数字世界的视角。本文将带你深入了解Web3的核心概念、技术特性以及它如何正在重塑我们的互联网体验。 从Web1.0到Web3&#xff1a;数字革命的演进 W…