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

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.mfbz.cn/a/567621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

毕业设计注意事项

1.开题 根据学院发的开题报告模板完成&#xff0c;其中大纲部分可参考资料 2.毕设 根据资料中的毕设评价标准&#xff0c;对照工作量 3.论文 3.1 格式问题 非常重要&#xff0c;认真对比资料中我发的模板&#xff0c;格式有问题&#xff0c;答辩输一半&#xff01; 以word…

wireshark RTP分析参数

主要看丢弃和Delta&#xff0c; 丢弃就是丢掉的udp包&#xff0c;所占的比率 Delta是当前udp包接收到的时间减去上一个udp包接收到的时间 根据载荷可以知道正确的delta应该是多少&#xff0c;比如G711A&#xff0c;ptime20&#xff0c;那么delta理论上应该趋近于20. 这里的de…

C++面向对象程序设计 - 运算符重载

函数重载就是对一个已有的函数赋予新的含义&#xff0c;使之实现新的功能。因此一个函数名就可以用来代表不同功能的函数&#xff0c;也就是一名多用。运算符也可以重载&#xff0c;即运算符重载&#xff08;operator overloading&#xff09;。 一、运算符重载的方法 运算符重…

# IDEA2019 如何打开 Run Dashboard 运行仪表面板

IDEA2019 如何打开 Run Dashboard 运行仪表面板 段子手168 1、依次点击 IDEA 上面工具栏 —> 【View】 视图。 —> 【Tool Windows】 工具。 —> 【Run Dashboard】 运行仪表面板。 2、如果 【Tool Windows 】工具包 没有 【Run Dashboard】 运行仪表面板 项 依次…

【好书推荐7】《机器学习平台架构实战》

【好书推荐7】《机器学习平台架构实战》 写在最前面《机器学习平台架构实战》编辑推荐内容简介作者简介目  录前  言本书读者内容介绍充分利用本书下载示例代码文件下载彩色图像本书约定 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&…

STM32系统参数和结构

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 基本参数 2. 片上资源&#xff08;外设&#xff09; 3. STM32系列命名规则 4. 系统结构 5. 引脚定义 6. 启动配置 7. 最小系统电路 8. 型号分类和缩写 1. 基本参数 STM32F103C8T6 系列&#…

达梦(DM)数据库表索引

达梦DM数据库表索引 表索引索引准则其他准则 创建索引显式地创建索引其他创建索引语句 使用索引重建索引删除索引 表索引 达梦数据库表索引相关内容比较多&#xff0c;常用的可能也就固定的一些&#xff0c;这里主要说一下常用的索引&#xff0c;从物理存储角度进行分类&#…

B008-方法参数传递可变参数工具类

目录 方法参数传递可变参数冒泡排序Arrays工具类Arrays工具类常用方法 方法参数传递 /*** java中只有值传递* 基本数据类型 传递的是具体的值* 引用数据类型 传递的是地址值*/ public class _01_ParamPass {public static void main(String[] args) {// 调用方法 getSumge…

网络变压器在网络分析仪上能通过测试,装上设备后网速达不到呢?

Hqst华轩盛(石门盈盛)电子导读&#xff1a;今天和大家一起探讨网络变压器在网络分析仪上能通过测试&#xff0c;装上设备后网通设备网速达不到的可能原因及其处理方式 一、出现这种情况可能有以下原因&#xff1a; 1.1. 设备兼容性问题&#xff1a;设备其它元器件与 网络…

Docker容器化技术:概述与安装

目录 一、云基础知识 1、常见的云服务厂商 2、云计算服务模式三种层次 3、什么是虚拟化 4、什么是虚拟机 5、虚拟化产品 5.1 仿真虚拟化产品 5.2 半虚拟化产品 5.3 全虚拟化产品 6、虚拟机架构 6.1 寄居架构 6.2 源生架构 二、认识容器 1、容器的概述 2、容器的…

【Netty】ByteBuf与拆包粘包

ByteBuf 在介绍ByteBuf之前先来一套基础的代码来演示ByteBuf的使用。 package blossom.project.netty;import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled;import java.nio.charset.StandardCharsets;/*** author: ZhangBlossom* date: 2023/12/14 13:37* con…

web学习

day02-01 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>js快速引入</title> <!-- 内部脚本--> <!-- <script>--> <!-- alert(Hello JS)--> <!-- <…

【linux】匿名管道|进程池

1.进程为什么要通信&#xff1f; 进程也是需要某种协同的&#xff0c;所以如何协同的前提条件(通信) 通信数据的类别&#xff1a; 1.通知就绪的 2.单纯的数据 3.控制相关的信息 2.进程如何通信&#xff1f; 进程间通信&#xff0c;成本会高一点 进程间通信的前提&#xff0c;先…

制氢机远程监控运维方案

制氢机远程监控运维方案 在当今能源转型的大背景下&#xff0c;氢能作为清洁、高效且可再生的能源载体&#xff0c;其重要性日益凸显。而制氢机作为氢能产业链中的关键设备&#xff0c;其稳定运行与高效运维对于保障氢气供应、推动氢能产业健康发展至关重要。在此背景下&#…

动态规划——切割钢条问题

一、动态规划 动态规划算法通常用于解决最优化问题&#xff08;寻求最优解&#xff09;。其思想与分治法类似&#xff0c;将待求解的问题分成若干个子问题&#xff0c;先求出子问题&#xff0c;再根据子问题的解求出原来问题中的解&#xff0c;与分支法不同的是&#xff0c;在动…

Oracle使用内部包自定义创建表空间和用户

如果之前有类似的表空间,可以使用dbms自动生成对应的表空间和数据文件 select dbms_metadata.get_ddl(TABLESPACE,ts.tablespace_name) from dba_tablespaces ts; 可以使用类似的 SQL> set echo off SQL> spool /data/logs/create_tablespace.log SQL> select dbms…

Mimics21软件学习总结

一. Mimics21软件安装过程 ① 解压下载好的Mimics软件包&#xff1b; ② 双击“MIS_Medical_21.0.exe”打开等待安装程序初始化完成&#xff1b; ③ 进入安装向导点击“next”&#xff1b; ④ 点击选择“Iaccept the agreement”同意相关协议&#xff0c;随后点击“next”&…

多模态大模型训练数据以及微调数据格式

多模态数据&#xff0c;尤其是中文多模态数据&#xff0c;找一些中文多模态的数据 中文多模态数据集汇总_数据集-阿里云天池本文整理汇总了业界常用的多模态中文数据集&#xff0c;提供了每个数据集的简介、官网、下载地址、Github代码等信息&#xff0c;方便算法研究人员学习…

虚假新闻检测——Adapting Fake News Detection to the Era of Large Language Models

论文地址&#xff1a;https://arxiv.org/abs/2311.04917 1.概论 尽管大量的研究致力于虚假新闻检测&#xff0c;这些研究普遍存在两大局限性&#xff1a;其一&#xff0c;它们往往默认所有新闻文本均出自人类之手&#xff0c;忽略了机器深度改写乃至生成的真实新闻日益增长的现…

Etsy多账号关联怎么办?Etsy店铺防关联解决方法

Etsy虽然相对于其他跨境电商平台来说比较小众&#xff0c;但因为平台是以卖手工艺品为主的&#xff0c;所以成本较低&#xff0c;利润很高。许多跨境卖家都纷纷入驻&#xff0c;导致平台规则越发严格&#xff0c;操作不当就会封号&#xff0c;比如一个卖家操作多个账号会出现关…
最新文章