uthash哈希的使用

做项目遇到需要使用到键值对的,一般我们会优先考虑map,multimap。

最近在看cocos2d-x源码,发现了一个更高效的用法uthash

头文件uthash.h在cocos2dx\support\data_support\下可以找到

下面是一个简单的使用:

 

[cpp][/cpp] view plaincopy

  1. #include “uthash.h”
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. /*这个uthash必须构造一个结构体*/
  5. struct packet
  6. {
  7.     int key;            /*这个是用来做hash的key值*/
  8.     char msg[10];
  9.     UT_hash_handle hh; /*这个结构是uthash的结构体,里面包含next,prev,hash值等信息*/
  10. };
  11. int main()
  12. {
  13.     struct packet *pkt, *tmp;
  14.     int i;
  15.     struct packet *hash_packet = NULL; /*必须初始化为NULL*/
  16.     /*打印这个hash的节点数*/
  17.     printf (“hash count = %d \n”, HASH_COUNT(hash_packet));
  18.     /*往hash中添加节点*/
  19.     for (i=0; i<10; i++)
  20.     {
  21.         pkt = (struct packet *)malloc(sizeof(struct packet));
  22.         pkt->key = i;
  23.         sprintf (pkt->msg, “i=%d”, i);
  24.         HASH_FIND_INT(hash_packet, &i, tmp);
  25.         if (tmp != NULL)
  26.         {
  27.             printf (“The key(%d) exists in hash. \n”, i);
  28.             continue;
  29.         }
  30.         HASH_ADD_INT(hash_packet, key, pkt);
  31.         printf (“insert item. key=%d,value=%p \n”, i, pkt);
  32.     }
  33.     printf (“hash count = %d \n”, HASH_COUNT(hash_packet));
  34.     /*通过key查找*/
  35.     for (i=0; i<13; i++)
  36.     {
  37.         HASH_FIND_INT(hash_packet, &i, tmp);
  38.         if (tmp == NULL)
  39.         {
  40.             printf (“find not item. key=%d,value=%p \n”, i, tmp);
  41.             continue;
  42.         }
  43.         printf (“find item. key=%d,value=%p \n”, i, tmp);
  44.     }
  45.     printf (“hash count = %d \n”, HASH_COUNT(hash_packet));
  46.     /*遍历这个hash表*/
  47.     struct packet* mytemp = NULL;
  48.     for (mytemp = hash_packet; mytemp != NULL; mytemp = (packet*)mytemp->hh.next)
  49.         printf (” %d => %s \n”, mytemp->key, mytemp->msg);
  50.     /*删除节点*/
  51.     for (i=0; i<13; i++)
  52.     {
  53.         HASH_FIND_INT(hash_packet, &i, tmp);
  54.         if (tmp == NULL)
  55.         {
  56.             printf (“find not item. key=%d,value=%p \n”, i, tmp);
  57.             continue;
  58.         }
  59.         /*删除节点不会释放你的空间必须自己释放*/
  60.         HASH_DEL(hash_packet, tmp);
  61.         free(tmp);
  62.         printf (“delete itme. key=%d,value=%p \n”, i, tmp);
  63.     }
  64.     printf (“hash count = %d \n”, HASH_COUNT(hash_packet));
  65.     system(“pause”);
  66.     return 0;
  67. }

标签