简单好用的hash表-----uthash
来源:互联网 发布:ios上的编程软件 编辑:程序博客网 时间:2024/06/05 12:40
在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现,
uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可。
Uthash的三个数据结构:
1. typedef struct UT_hash_bucket {
struct UT_hash_handle *hh_head;
unsigned count;
unsigned expand_mult;
} UT_hash_bucket;
UT_hash_bucket作用提供根据hash进行索引。
2.typedef struct UT_hash_table {
UT_hash_bucket *buckets;
unsigned num_buckets, log2_num_buckets;
unsigned num_items;
struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
unsigned ideal_chain_maxlen;
unsigned nonideal_items;
unsigned ineff_expands, noexpand;
uint32_t signature; /* used only to find hash tables in external analysis */
#ifdef HASH_BLOOM
uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
uint8_t *bloom_bv;
char bloom_nbits;
#endif
} UT_hash_table;
UT_hash_table可以看做hash表的表头。
3. typedef struct UT_hash_handle {
struct UT_hash_table *tbl;
void *prev; /* prev element in app order */
void *next; /* next element in app order */
struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
struct UT_hash_handle *hh_next; /* next hh in bucket order */
void *key; /* ptr to enclosing struct's key */
unsigned keylen; /* enclosing struct's key len */
unsigned hashv; /* result of hash-fcn(key) */
} UT_hash_handle;
UT_hash_handle,用户自定义数据必须包含的结构。
三种数据结构的关系如下:
说明:
每一个节点(用户自定义的)必须包含一个UT_hash_handle hh
key:用户自定义,可以是int, string和指针。
hh_prev: 指向前一个UT_hash_handle
hh_next: 指向下一个UT_hash_handle
hashv:根据key计算出的hash值
prev: 指向前一个数据节点(Hash冲突时)
next: 指向下一个数据节点(Hash冲突时)
hho: 数据节点中hh于用户节点首地址的差。
uthash使用代码例子
#include "uthash.h"#include <stdlib.h> /* malloc */#include <stdio.h> /* printf */#include <time.h>typedef struct example_user_t { int id; int cookie; UT_hash_handle hh;} example_user_t;int main(int argc,char *argv[]) { int i; example_user_t *user, *users=NULL; srand((unsigned int)time(NULL)); /* create elements */ for(i=0;i<10;i++) { if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-1); user->id = rand()%100; user->cookie = i*i; HASH_ADD_INT(users,id,user); } for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) { printf("user %d, cookie %d\n", user->id, user->cookie); } return 0;}
- 简单好用的hash表-----uthash
- C开源hash代码uthash的用法总结(1)
- C开源hash代码uthash的用法总结(2)
- 开源hash代码uthash的原理与用法
- C开源hash代码uthash的用法总结(1)
- C开源hash代码uthash的用法总结
- C开源hash代码uthash的用法总结
- cocos2dx-实现CCDictionary的hash库uthash详解
- 一个很好用的哈希 uthash
- 基于uthash的GNU/linux下简单hash_table模板类
- C开源hash代码uthash的用法实例,亲测有效
- 超好用的uthash万岁~~~
- uthash的三个数据结构
- UThash 的数据结构
- UThash 的数据结构
- 超好用的uthash万岁~~~
- 运用C中的uthash.t头文件来实现hash表
- uthash
- C++与FLASH交互及视频帧保存方案
- ACI 样例
- HTML实体符号代码速查表
- HTTP协议中PUT和POST使用上的区别
- Android IPC 通讯机制源码分析【下】
- 简单好用的hash表-----uthash
- 数据泵导入导出
- ACI权限控制
- Axis,axis2,Xfire以及cxf对比
- Android内核和驱动篇-Android内核介绍
- 范例-控制台-连续正整数改进版
- linux patch diff
- 用户,权限,目录管理指令练习
- Android系统移植全过程