swhash.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. *@file swhash.h
  3. *@brief 哈希表
  4. *@author niujiuru
  5. *data 2014-03-17
  6. */
  7. #ifndef __SWHASH_H__
  8. #define __SWHASH_H__
  9. /* hash算法 */
  10. enum hash_alg
  11. {
  12. BOB_HASH,
  13. ONEATATIME_HASH,
  14. TIME33_HASH,
  15. EXTEND_HASH, // 外部提供的hash算法
  16. };
  17. /* hash表类型(实现方式) */
  18. #define CHAIN_H 0U // chain hash (ch)
  19. /* hash算法外部扩展函数指针 */
  20. typedef uint32_t (*hash_ex_func_hash)(const unsigned char *key, uint32_t keylen);
  21. /* key字比较外部扩展函数指针 */
  22. typedef int32_t (*hash_ex_func_cmp)(const void *key1, int32_t key1len, const void *key2, int32_t key2len);
  23. /* data空间释放回调函数 */
  24. typedef void (*hash_data_free_cb)(void *data);
  25. /* visit遍历回调函数 */
  26. typedef void (*hash_visit_cb)(const void *key, int32_t keylen, void *data);
  27. /* hash表 */
  28. typedef struct shash_t *hash_t;
  29. #ifdef __cplusplus
  30. extern "C"
  31. {
  32. #endif
  33. /**
  34. * @brief 创建一个HASH表
  35. *
  36. * @param[in] size hash表长度
  37. * @param[in] keysize 关键字长度, 默认0为变长
  38. * @param[in] alg hash算法
  39. * @param[in] hfunc 扩展的hash算法函数, "alg"为"EXTEND_HASH"时有效
  40. * @param[in] cfunc 扩展的关键字比较函数, 默认NULL为逐字符比较
  41. * @param[in] fcb data空间释放回调函数
  42. * @param[in] flag hash碰撞冲突处理方式, 默认0为"CHAIN_H"
  43. *
  44. * @return hash_t
  45. * @retval NULL 申请失败
  46. */
  47. hash_t sw_hash_create(uint32_t size, uint32_t keysize, enum hash_alg alg, hash_ex_func_hash hfunc, hash_ex_func_cmp cfunc, hash_data_free_cb fcb, uint32_t flag);
  48. /**
  49. * @brief 添加一条记录
  50. *
  51. * @param[in] htable 哈希表
  52. * @param[in] key 关键字
  53. * @param[in] keylen 关键字长度
  54. * @param[in] data 数据
  55. *
  56. * @return 0 成功
  57. * @retval -1 添加失败
  58. */
  59. int32_t sw_hash_insert(hash_t htable, const void *key, int32_t keylen, const void *data);
  60. /**
  61. * @brief 删除一条记录
  62. *
  63. * @param[in] htable 哈希表
  64. * @param[in] key 关键字
  65. * @param[in] keylen 关键字长度
  66. * @param[in] bAutoFreeData 是否自动调用创建hash表时设定的"hash_data_free_cb"回调函数释放数据内存
  67. *
  68. * @return 0 成功
  69. * @retval -1 删除失败
  70. */
  71. int32_t sw_hash_delete(hash_t htable, const void *key, int32_t keylen, bool bAutoFreeData);
  72. /**
  73. * @brief 替换key的data值
  74. *
  75. * @param[in] htable 哈希表
  76. * @param[in] key 关键字
  77. * @param[in] keylen 关键字长度
  78. * @param[in] newdata 替换值
  79. * @param[out] olddata 被替换字指针的指针(data associated to this data MUST be freed by the caller)
  80. *
  81. * @return 0 成功
  82. * @retval -1 替换失败
  83. */
  84. int32_t sw_hash_replace(hash_t htable, const void *key, int32_t keylen, const void *newdata, void **olddata);
  85. /**
  86. * @brief 查找一条记录
  87. *
  88. * @param[in] htable 哈希表
  89. * @param[in] key 关键字
  90. * @param[in] keylen 关键字长度
  91. *
  92. * @return data 成功,返回查找到的记录
  93. * @retval NULL 查找失败
  94. */
  95. void *sw_hash_lookup(hash_t htable, const void *key, int32_t keylen);
  96. /** @brief 取得一个hash表长度 */
  97. uint32_t sw_hash_getTableSize(hash_t htable);
  98. /** @brief 取得一个hash表已存在元素的数目 */
  99. uint32_t sw_hash_getElemsCnt(hash_t htable);
  100. /** @brief 取得一个hash表中元素发生碰撞的次数(mixed-value) */
  101. uint32_t sw_hash_getElemCollisionCnts(hash_t htable);
  102. /** @brief 遍历一个hash表 */
  103. void sw_hash_visit(hash_t htable, hash_visit_cb vcb);
  104. /** @breif 销毁一个hash表("bAutoFreeData"-是否自动调用创建hash表时设定的"hash_data_free_cb"回调函数释放数据内存) */
  105. void sw_hash_destroy(hash_t htable, bool bAutoFreeData);
  106. #ifdef __cplusplus
  107. }
  108. #endif
  109. #endif /* __SWHASH_H__ */