当前位置:首页 > 工具 > 正文内容

C语言哈希表实现详解:UTHASH库应用指南

访客 工具 2026年7月27日 2

UTHASH库核心功能解析

UTHASH是由Troy D. Hanson开发的C语言宏实现哈希表解决方案,通过头文件集成方式提供键值存储能力。该库包含基础哈希表功能及扩展组件,适用于多种开发场景。

核心特性

  • 零依赖架构:仅需包含uthash.h头文件即可使用
  • 轻量级设计:约1000行代码实现完整哈希表功能
  • 多类型支持:整数/字符串/结构体均可作为键值
  • 平台兼容性:支持Linux/Windows/Android等系统

组件构成

UTHASH包含以下扩展模块:

  • utlist.h:链表操作宏
  • utarray.h:动态数组管理
  • utstring.h:动态字符串处理
  • utringbuffer.h:环形缓冲区实现

快速上手

  1. 结构体定义
    #include "uthash.h"
    typedef struct {
        int userId;          // 唯一标识字段
        char username[50];   // 数据字段
        UT_hash_handle hh;   // 哈希句柄
    } user_info;
  2. 初始化声明
    user_info *userList = NULL;
  3. 操作示例
    // 添加记录
    void insertUser(int id, const char *name) {
        user_info *tmp;
        HASH_FIND_INT(userList, &id, tmp);
        if (!tmp) {
            tmp = malloc(sizeof(user_info));
            tmp->userId = id;
            HASH_ADD_INT(userList, userId, tmp);
        }
        strcpy(tmp->username, name);
    }

高级功能

键值类型支持

类型操作示例
整数HASH_ADD_INT()
字符串HASH_ADD_STR()
结构体自定义字段映射

性能优化

支持多种哈希算法选择:

  • HASH_FUNCTION_JEN(Jenkins哈希)
  • HASH_FUNCTION_SAX(SAX哈希)
  • HASH_FUNCTION_OAT(One-at-a-Time哈希)

通过预定义宏切换算法: #define HASH_FUNCTION HASH_FUNCTION_JEN

应用场景

#include 
#include "uthash.h"

typedef struct {
    int id;
    char name[64];
    UT_hash_handle hh;
} person;

person *people = NULL;

// 插入数据
void addPerson(int id, const char *name) {
    person *p;
    HASH_FIND_INT(people, &id, p);
    if (!p) {
        p = malloc(sizeof(person));
        p->id = id;
        HASH_ADD_INT(people, id, p);
    }
    strcpy(p->name, name);
}

// 遍历输出
void listPeople() {
    person *p;
    for (p = people; p != NULL; p = p->hh.next) {
        printf("ID: %d, Name: %s\n", p->id, p->name);
    }
}

int main() {
    addPerson(101, "张三");
    addPerson(102, "李四");
    listPeople();
    return 0;
}

验证测试

执行测试套件验证功能完整性:

cd tests
make
./do_tests

详细文档参考:doc/userguide.txt

标签: uthashc宏

相关文章

Trojan服务器搭建与配置

一、整体架构(先对齐认知)Clash Meta (PC / iOS / Android)        ↓ TLS   Trojan Server (443)        ↓     InternetTrojan 的核心是: TLS + HTTPS 流量伪装 看起来像正常网站 非常适合...

Tailscale 的详细用法

Tailscale 是一种基于 WireGuard 协议 的 零配置 VPN(虚拟私有网络)服务,让设备之间能够 安全、加密地直接连接,就像它们在同一个本地网络一样。它的核心特点是 简单、安全、跨平台。Tailscale 非常适合 没有公网 IP、两台电脑不在同一局域网 的场景。 简单来说,Tailscale 是什么?Tailscale 是一款让你的各种设备(电脑、服务器、手机...

Clash Tun 模式 导致 爱快(iKuai SD-Wan)内网域名无法访问

一、Clash  DNS 配置dns:  enable: true  listen: 0.0.0.0:53  ipv6: true  enhanced-mode: redir-host  nameserver:    - 223.5.5.5    - 223.6.6.6iKuai 内网域名 ...

深入解析Node.js运行环境与异步I/O架构

深入解析Node.js运行环境与异步I/O架构

核心定义与价值Node.js本质上是一个JavaScript运行环境,而非编程语言或应用框架。它赋予了JavaScript脱离浏览器在服务端、命令行工具及网络应用中执行的能力。其核心意义在于:用单一语言打通前后端开发壁垒。基于事件驱动与非阻塞I/O的架构特性,Node.js在处理API网关、实时通信及微服务等I/O密集型场景时表现卓越,已成为现代后端工程的主流选择。浏览器沙箱限制1995年Java...

ADO.NET SQL参数化查询的最佳实践

在 ADO.NET 中执行 SQL 查询时,参数化查询是一种关键的安全措施和性能优化手段。它通过将 SQL 命令和用户提供的数据分开处理,有效防止了 SQL 注入攻击,并有助于数据库缓存执行计划。下面总结了几种常用的参数化查询方式。 1. 使用 SqlParameter 对象(推荐) 这是最推荐的参数化查询方式。通过显式创建 SqlParameter 对象,您可以精确控制参数的类...

基于ELK的日志集中化分析系统搭建

构建统一日志管理平台的必要性 在分布式架构中,各服务节点独立运行,日志分散存储于不同主机。传统通过命令行工具如grep、awk逐个检索日志的方式,在数据量庞大时效率极低,难以实现快速定位问题。为提升运维效率,需建立集中式日志处理体系,具备日志采集、传输、存储、分析与告警能力。 ELK技术栈核心组件解析 Elasticsearch:分布式搜索引擎,支持全文检索、实时数据分析和高可用集群部署,...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。