1)字符串在结构体中

一个字符串做键的哈希(字符串在结构体中):uthash_exer1.c

#include <string.h>  /* strcpy */
#include <stdlib.h>  /* malloc */
#include <stdio.h>   /* printf */
#include "uthash.h"struct my_struct {char name[10];             /* 键(字符串在这个结构体内部) */int id;UT_hash_handle hh;         /* 使得这结构体可哈希 */
};int main(int argc, char *argv[]) {const char *names[] = { "joe", "bob", "betty", NULL };struct my_struct *s, *tmp;struct my_struct *users = NULL; //用作哈希表头//分配一个结构体,内部name成员存储传入的字符串//并且使用结构体name字段将结构体存入以s为表头的哈希表for (int i = 0; names[i]; ++i) {s = (struct my_struct *)malloc(sizeof *s);strcpy(s->name, names[i]);s->id = i;HASH_ADD_STR(users, name, s);}// 根据传入字符串为键,从哈希表中查找结构体,如果存在,输出这个结构体的id成员变量for (int i = 0; names[i]; i++){HASH_FIND_STR(users, names[i], s);if (s) printf("%s's id is %d\n", names[i] ,s->id);}/* 从哈希表中取出结构体,并且从哈希表中删除,然后释放这个结构体 */HASH_ITER(hh, users, s, tmp) {HASH_DEL(users, s);free(s);}return 0;
}

编译以上程序,进行测试:

[blctrl@rockygu uthash]$ gcc uthash_exer1.c -o uthash_exer1
[blctrl@rockygu uthash]$ ./uthash_exer1
joe's id is 0
bob's id is 1
betty's id is 2

2)在结构体中字符串指针

现在,这是一个相同示例,但使用了一个char *键替换char []。

一个以字符串为键的哈希(结构体中指字符指针)

#include <string.h>  /* strcpy */
#include <stdlib.h>  /* malloc */
#include <stdio.h>   /* printf */
#include "uthash.h"struct my_struct {const char *name;          /* 键:内容在结构体外 */int id;UT_hash_handle hh;         /* 使得这个结构体可哈希  */
};int main(int argc, char *argv[]) {const char *names[] = { "joe", "bob", "betty", NULL };struct my_struct *s, *tmp;struct my_struct *users = NULL; //哈希表头for (int i = 0; names[i]; ++i) {s = (struct my_struct *)malloc(sizeof *s);s->name = names[i]; //结构体的name成员指向一个字符串s->id = i;// 结构体可哈希标识成员,哈希表头,作为键的成员变量,成员变量指向字符串的长度,要放入哈希表的结构体HASH_ADD_KEYPTR(hh, users, s->name, strlen(s->name), s);}for (int i = 0; names[i]; i++){HASH_FIND_STR(users, names[i], s);if (s) printf("%s's id is %d\n", names[i], s->id);}/* 释放哈希表,并且释放分配的结构体*/HASH_ITER(hh, users, s, tmp) {HASH_DEL(users, s);free(s);}return 0;
}

编译以上程序,进行测试:

[blctrl@rockygu uthash]$ gcc uthash_exer2.c -o uthash_exer2
[blctrl@rockygu uthash]$ ./uthash_exer2
joe's id is 0
bob's id is 1
betty's id is 2

3) 指针键

键可以是一个指针。

#include <stdio.h>
#include <stdlib.h>
#include "uthash.h"typedef struct {void *key;int i;UT_hash_handle hh;
} el_t;el_t *hash = NULL;  //哈希表表头
char *someaddr = "Hello World found by uthash";int main() {el_t *d;el_t *e = (el_t *)malloc(sizeof(el_t));if (!e){return -1;}printf("address:0x%p->%s", &someaddr, someaddr);// 结构体成员变量key存储了一个地址e->key = (void*)someaddr;e->i = 1;// 以结构体字段key为键,将结构体e存入哈希表hashHASH_ADD_PTR(hash, key, e);// 以变量someaddr的地址为键,在哈希表hash中查找结构体,用d指向找到的结构体HASH_FIND_PTR(hash, &someaddr, d);if (d) {printf("found\n");printf("content:%s\n", (char *)d->key);}/* 从哈希表中删除这个结构体 */HASH_DEL(hash, e);/* 释放这个结构体 */free(e);return 0;
}

编译测试以上程序:

[blctrl@rockygu uthash]$ gcc uthash_exer3.c -o uthash_exer3
[blctrl@rockygu uthash]$ ./uthash_exer3
address:0x0x602058->Hello World found by uthashfound
content:Hello World found by uthash

4) 结构体键

你的键字段可以有任何数据类型。对于uthash,它只是一个字节序列。因而,即使一个嵌套结构体也可以被用作一个键。我们将使用一般宏HASH_ADD和HASH_FIND来演示。

在添加一个项到这个哈希或者查找一个项前,这些填充字节必须被置零。因而,在设置感兴趣成员前,总是置零整个结构体。以下示例做了这件事,键对memset的两次调用。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include "uthash.h"typedef struct {char a;int b;
} record_key_t;typedef struct {record_key_t key; // 作为这个结构体的键int i;char name[21];UT_hash_handle hh;
} record_t;int main(int argc, char *argv[]) {record_key_t l;record_t  *p, *r, *tmp;record_t *records = NULL; // 作为哈希表头r = (record_t *)malloc(sizeof(record_t));// 对分配的record_t结构体填充0memset(r, 0, sizeof(record_t));// 设置键r->key.a = 'a';r->key.b = 1;// 设置其它成员r->i = 666;strcpy(r->name, "hello world, uthash");// 用结构体的key字段作为键,并出入这个键的尺寸,将结构体r放入哈希表recordsHASH_ADD(hh, records, key, sizeof(record_key_t), r);// 对record_key_t类型的变量填充0memset(&l, 0, sizeof(record_t));// 设置键l.a = 'a';l.b = 1;// 通过类型record_key_t的键,并且传入这个键的大小,查找结构体,并且用p指向这个结构体HASH_FIND(hh, records, &l, sizeof(record_key_t), p);if (p) {printf("found %c %d\n", p->key.a, p->key.b);printf("content:%d, %s\n", p->i, p->name);}HASH_ITER(hh, records, p, tmp) {HASH_DEL(records, p);free(p);}return 0;
}

编译以上程序,并进行测试:

[blctrl@rockygu uthash]$ gcc uthash_exer4.c -o uthash_exer4
[blctrl@rockygu uthash]$ ./uthash_exer4
found a 1
content:666, hello world, uthash

uthash使用示例相关推荐

  1. uthash宏测试程序示例

    以下是一个测试uthash宏的测试程序: 用以下一个测试程序uthash_test.c,对uthash中宏进行封装: 1) 定义了一个使用uthash的结构体MY_STRUCT,注意这个结构体中包含了 ...

  2. C开源hash代码uthash的用法总结(1)

    uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找.插入.删除等待.该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用 ...

  3. 浅析uthash系列之User Guide(翻译)

    uthash用户指引 作者:Troy D. Hanson, Arthur O'Dwyer 翻译:jafon.tian 转载请注明出处:https://blog.csdn.net/JT_Notes 下载 ...

  4. c开源hash项目 uthash的用法总结

    uthash 是C的比较优秀的开源代码,它实现了常见的hash操作函数,例如查找.插入.删除等待.该套开源代码采用宏的方式实现hash函数的相关功能,支持C语言的任意数据结构最为key值,甚至可以采用 ...

  5. uthash用户手册(一)

    一种在C中的哈希 本手册位C程序源编写.因为你正在阅读此手册,你可能了解哈希被用于使用键来查找项目.在脚本语言中,哈希或者"字典"被一直使用.哈希在C语言子树中不存在.此软件为C结 ...

  6. C语言uthash使用指南

    1. C语言中的哈希 2. 它能做什么? 3. 您的结构 1. The key 2. Unique keys(唯一键值) 3. 哈希句柄 2. 关于memory 1. 开销 2. 清理如何进行 3. ...

  7. .net连接mysql数据_.net连接MYSQL数据库的方法及示例!

    连接MYSQL数据库的方法及示例 方法一: 使用MYSQL推出的MySQL Connector/Net is an ADO.NET driver for MySQL 该组件为MYSQL为ADO.NET ...

  8. CPU Cache原理与示例

    CPU Cache原理与示例 基础知识 现在的 CPU 多核技术,都会有几级缓存,老的 CPU 会有两级内存(L1 和 L2),新的CPU会有三级内存(L1,L2,L3 ),如下图所示: 其中:  ...

  9. 编译器 llvm clang 源码转换示例

    编译器 llvm clang 源码转换示例 从git获取llvm项目的源码方式: git clone https://github.com/llvm/llvm-project.git 下载源码后,进入 ...

最新文章

  1. CV语义分割实践指南!
  2. ProgressDialog用法详解
  3. 《从零开始学Swift》学习笔记(Day 33)——属性观察者
  4. 云炬Android开发笔记 2-2 Android studio项目上传到Github及无法连接Github的问题处理
  5. C++实现complex number复数的算法(附完整源码)
  6. 部署也是工程的一部分,也要编程(自动化)
  7. 在线代理和缓存工具(转)
  8. 如何克服大数据安全问题
  9. Spring(16)——使用注解进行bean定义
  10. jQuery EasyUI快速入门01
  11. 《SEM长尾搜索营销策略解密》一一2.13 ZARA,零售界的长尾赢家
  12. 钉钉微应用H5的调试方法
  13. 【Beta】 第四次Daily Scrum Meeting
  14. java halt_Java Runtime halt()方法
  15. 东南亚跨境电商平台Lazada、Shopee、速卖通转化率低怎么办?(测评自养号)
  16. CSDN浏览器插件评测
  17. Nvidia驱动卸载干净了,新驱动却还是安装不上?
  18. Oracle学生表练习
  19. Centos7.6升级到Centos8.0
  20. DNS解析与域名服务安全防护策略

热门文章

  1. 【FTP工具】- Win10下免费的FTP服务器搭建 - FileZilla 的下载、安装、使用
  2. 七夕到了——属于程序员的浪漫
  3. 数据结构 02 - 单链表的使用 环形链表的实现与应用
  4. 昨天佛媛,今天病媛,媛媛不断,只有程序媛才是yyds!
  5. WebRTC:P2P 连接过程完全解析
  6. 卷积层相比全连接层的优点
  7. 华为inside第一辆车来了!总裁说:若计算上干不过特斯拉,可关门不干了
  8. 深度学习的数学:神经网络的数学基础 - 阅读笔记
  9. docker删除php,docker的卸载及重新安装方法
  10. 《精通CSS-高级Web标准解决方案》 笔记