在软件开发中,不可不免的会使用到hash表,hash表的优点这里就不说了,以下介绍一个hash表的C实现,

uthash是用宏实现的,使用的时候非常方便,只用包含uthash.h即可。

Uthash的三个数据结构:

  1. typedef struct UT_hash_bucket {
  2.  
  3. struct UT_hash_handle *hh_head;
  4.  
  5. unsigned count;
  6.  
  7. unsigned expand_mult;
  8.  
  9. } UT_hash_bucket;

UT_hash_bucket作用提供根据hash进行索引。

  1. typedef struct UT_hash_table {
  2.  
  3. UT_hash_bucket *buckets;
  4.  
  5. unsigned num_buckets, log2_num_buckets;
  6.  
  7. unsigned num_items;
  8.  
  9. struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
  10.  
  11. ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
  12.  
  13. unsigned ideal_chain_maxlen;
  14. unsigned nonideal_items;
  15. unsigned ineff_expands, noexpand;
  16. uint32_t signature; /* used only to find hash tables in external analysis */
  17.  
  18. #ifdef HASH_BLOOM
  19. uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
  20. uint8_t *bloom_bv;
  21. char bloom_nbits;
  22. #endif
  23.  
  24. } UT_hash_table;

UT_hash_table可以看做hash表的表头。

  1. typedef struct UT_hash_handle {
  2.  
  3.   struct UT_hash_table *tbl;
  4.  
  5.   void *prev; /* prev element in app order */
  6.   void *next; /* next element in app order */
  7.  
  8.   struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
  9.   struct UT_hash_handle *hh_next; /* next hh in bucket order */
  10.  
  11.   void *key;      /* ptr to enclosing struct's key */
  12.  
  13.   unsigned keylen;  /* enclosing struct's key len */
  14.   unsigned hashv;   /* result of hash-fcn(key) */
  15.  
  16. } 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使用代码例子

  1. #include "uthash.h"
  2. #include <stdlib.h> /* malloc */
  3. #include <stdio.h> /* printf */
  4. #include <time.h>
  5.  
  6. typedef struct example_user_t {
  7. int id;
  8. int cookie;
  9. UT_hash_handle hh;
  10. } example_user_t;
  11.  
  12. int main(int argc,char *argv[]) {
  13. int i;
  14. example_user_t *user, *users=NULL;
  15.  
  16. srand((unsigned int)time(NULL));
  17. /* create elements */
  18. for(i=;i<;i++) {
  19. if ( (user = (example_user_t*)malloc(sizeof(example_user_t))) == NULL) exit(-);
  20. user->id = rand()%;
  21. user->cookie = i*i;
  22. HASH_ADD_INT(users,id,user);
  23. }
  24.  
  25. for(user=users; user != NULL; user=(example_user_t*)(user->hh.next)) {
  26. printf("user %d, cookie %d\n", user->id, user->cookie);
  27. }
  28. return ;
  29. }

简单好用的hash表-----uthash的更多相关文章

  1. 6.数组和Hash表

    当显示多条结果时,存储在变量中非常智能,变量类型会自动转换为一个数组. 在下面的例子中,使用GetType()可以看到$a变量已经不是我们常见的string或int类型,而是Object类型,使用-i ...

  2. PHP数组/Hash表的实现/操作、PHP变量内核实现、PHP常量内核实现 - [ PHP内核学习 ]

    catalogue . PHP Hash表 . PHP数组定义 . PHP变量实现 . PHP常量实现 1. PHP Hash表 0x1: 基本概念 哈希表在实践中使用的非常广泛,例如编译器通常会维护 ...

  3. Hash表算法

    出处:http://blog.csdn.net/v_JULY_v 第一部分:Top K 算法详解问题描述百度面试题:    搜索引擎会通过日志文件把用户每次检索使用的所有检索串都记录下来,每个查询串的 ...

  4. 【转载】一步一步写算法(之hash表)

    转载自:http://blog.csdn.net/feixiaoxing/article/details/6885657 [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaox ...

  5. HASH表原理(装)

    HASH表原理 大家都知道,在所有的线性数据结构中,数组的定位速度最快,因为它可通过数组下标直接定位到相应的数组空间,就不需要一个个查找.而哈希表就是利用数组这个能够快速定位数据的结构解决以上的问题的 ...

  6. 十一、从头到尾彻底解析Hash 表算法

    在研究MonetDB时深入的学习了hash算法,看了作者的文章很有感触,所以转发,希望能够使更多人受益! 十一.从头到尾彻底解析Hash 表算法 作者:July.wuliming.pkuoliver  ...

  7. NGINX(三)HASH表

    前言 nginx的hash表有几种不同的种类, 不过都是以ngx_hash_t为基础的, ngx_hash_t是最普通的hash表, 冲突采用的是链地址法, 不过这里冲突的元素不是一个链表, 而是一个 ...

  8. 一步一步写算法(之hash表)

    [ 声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] hash表,有时候也被称为散列表.个人觉得,hash表是介于链表和二叉树之间的一种中间结构.链 ...

  9. 海量路由表能够使用HASH表存储吗-HASH查找和TRIE树查找

    千万别! 非常多人这样说,也包括我. Linux内核早就把HASH路由表去掉了.如今就仅仅剩下TRIE了,只是我还是希望就这两种数据结构展开一些形而上的讨论. 1.hash和trie/radix ha ...

随机推荐

  1. web应用程序访问串口

    https://github.com/tylermenezes/SerialServe https://github.com/straend/SerialWebsocket http://www.cn ...

  2. [转]自定义Drawable实现灵动的红鲤鱼动画(上篇)

    此篇中的小鱼动画是模仿国外一个大牛做的flash动画,第一眼就爱上它了,简约灵动又不失美学,于是抽空试着尝试了一下,如下是我用Android实现的效果图:   小鱼儿 由于整个绘制分析过程比较繁琐所以 ...

  3. JDK5.0特性,使用ProcessBuilder执行本地命令

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IO ...

  4. 虚拟机下linux迁移造成MAC地址异常处理办法

    虚拟机下linux迁移造成MAC地址异常处理办法 Linux无法启用网卡:Device eth0 has different MAC address than expected,ignoring解决 ...

  5. Hibernate3.x异常No row with the given identifier exists 解决方法

    这个异常是在 多对一关系映射时,一方表中对应的数据不存在才抛出的.原来的配置: <many-to-one class="com.art.model.user.UserInfo" ...

  6. document.ready、window.onload、body.onload的区别

    document的ready事件通常会比window的onload事件先发生,为什么呢? 因为document的ready是在浏览器加载解析并构建完doc文档模型时发生的,而window的onload ...

  7. 各种HTTPS站点的SSL证书 ,扩展SSL证书,密钥交换和身份验证机制汇总

    各种HTTPS站点的SSL证书 ,扩展SSL证书,密钥交换和身份验证机制汇总 一份常见的 HTTPS 站点使用的证书和数据加密技术列表,便于需要时比较参考,将持续加入新的 HTTP 站点,这里给出的信 ...

  8. Linux下通用线程池的创建与使用

    线程池:简单地说,线程池 就是预先创建好一批线程,方便.快速地处理收到的业务.比起传统的到来一个任务,即时创建一个线程来处理,节省了线程的创建和回收的开销,响应更快,效率更高. 在linux中,使用的 ...

  9. HDUOJ---3743Frosh Week(BIT+离散化)

    Frosh Week Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  10. Windows下面安装和配置Solr 4.9(一)

       1.Solr下载 下载地址 :http://lucene.apache.org/solr/   2.解压,测试 在example文件夹中找到start.jar文件,用命令提示符运行这个文件:ja ...