C语言哈希表实现详解:UTHASH库应用指南
UTHASH库核心功能解析
UTHASH是由Troy D. Hanson开发的C语言宏实现哈希表解决方案,通过头文件集成方式提供键值存储能力。该库包含基础哈希表功能及扩展组件,适用于多种开发场景。
核心特性
- 零依赖架构:仅需包含uthash.h头文件即可使用
- 轻量级设计:约1000行代码实现完整哈希表功能
- 多类型支持:整数/字符串/结构体均可作为键值
- 平台兼容性:支持Linux/Windows/Android等系统
组件构成
UTHASH包含以下扩展模块:
- utlist.h:链表操作宏
- utarray.h:动态数组管理
- utstring.h:动态字符串处理
- utringbuffer.h:环形缓冲区实现
快速上手
- 结构体定义
#include "uthash.h" typedef struct { int userId; // 唯一标识字段 char username[50]; // 数据字段 UT_hash_handle hh; // 哈希句柄 } user_info; - 初始化声明
user_info *userList = NULL; - 操作示例
// 添加记录 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
