dhash.c
上传用户:knt0001
上传日期:2022-01-28
资源大小:264k
文件大小:3k
源码类别:

Email客户端

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include "dlib.h"
  7. #include "dutil.h"
  8. #include "dhash.h"
  9. #include "dlist.h"
  10. typedef struct {
  11. char *key;
  12. void *val;
  13. } dhashval;
  14. /**
  15.  * Obviously creates a hash value and returns it
  16.  */
  17. static unsigned int
  18. hash(const char *key, unsigned int tableSize)
  19. {
  20. register const char *ptr = key;
  21. register unsigned int value = 0;
  22. while (*ptr != '') {
  23. value = (value * 37) + (int) *ptr++;
  24. }
  25. return value % tableSize;
  26. }
  27. /**
  28.  * Transverse the list provided in search of the key.
  29.  */
  30. static dhashval *
  31. getValueFromList(dlist top, const char *key)
  32. {
  33. dhashval *keyval = NULL;
  34. while ((keyval = (dhashval *)dlGetNext(top))) {
  35. if (strcmp(keyval->key, key) == 0) {
  36. break;
  37. }
  38. }
  39. return keyval;
  40. }
  41. /**
  42.  * Initialize the hash table.
  43.  *
  44.  * Params
  45.  *  size - The size you want the table to be (will go up by next prime)
  46.  *
  47.  * Return
  48.  *  A new dhash
  49.  */
  50. dhash
  51. dhInit(size_t size, dhashDestroyFunc destroy)
  52. {
  53. uint i;
  54. dhash table = xmalloc(sizeof(struct _dhash));
  55. table->tableSize = nextprime(size);
  56. table->destroy = destroy;
  57. table->hashed = xmalloc(table->tableSize * sizeof(struct _dlist));
  58. for (i=0; i < table->tableSize; i++) {
  59. table->hashed[i] = dlInit(NULL);
  60. }
  61. return table;
  62. }
  63. /**
  64.  * Lookup a key in the hash table and return it's key/val pair.
  65.  *
  66.  * Params
  67.  *  table - The dhash table to use
  68.  *  key - A key to fine in the hash
  69.  *
  70.  * Return
  71.  *  The data they hashed if it's found.
  72.  *  NULL if nothing is found.
  73.  */
  74. void *
  75. dhGetItem(dhash table, const char *key)
  76. {
  77. unsigned int index = 0;
  78. dlist list = NULL;
  79. dhashval *keyval = NULL;
  80. index = hash(key, table->tableSize);
  81. list = table->hashed[index];
  82. if (list)  { 
  83. keyval = getValueFromList(list, key);
  84. }
  85. if (!keyval) {
  86. return NULL;
  87. }
  88. dlReset(list);
  89. return keyval->val;
  90. }
  91. /**
  92.  * Insert a key and value into the hashed array.
  93.  *
  94.  * Params
  95.  *  hash - The hash table to insert into
  96.  *  keyval - A dhashval struct with a populated key/val
  97.  */
  98. void
  99. dhInsert(dhash top, const char *key, const void *val)
  100. {
  101. unsigned int index = 0;
  102. dhashval *item = xmalloc(sizeof(dhashval));
  103. item->key = xstrdup(key);
  104. item->val = (void *)val;
  105. index = hash(item->key, top->tableSize);
  106. dlInsertTop(top->hashed[index], item);
  107. }
  108. /**
  109.  * Free all allocated memory in the hashed array
  110.  *
  111.  * Params
  112.  *  table - The hash table to free
  113.  */
  114. void
  115. dhDestroy(dhash table)
  116. {
  117. uint i;
  118. dhashval *next;
  119. if (table) {
  120. for (i=0; i < table->tableSize; i++) {
  121. dlist this = table->hashed[i];
  122. while ((next = (dhashval *)dlGetNext(this))) {
  123. xfree(next->key);
  124. if (table->destroy) {
  125. table->destroy(next->val);
  126. }
  127. xfree(next);
  128. }
  129. dlDestroy(this);
  130. }
  131. xfree(table->hashed);
  132. xfree(table);
  133. }
  134. }