| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- /**
- *@file swhash.h
- *@brief 哈希表
- *@author niujiuru
- *data 2014-03-17
- */
- #ifndef __SWHASH_H__
- #define __SWHASH_H__
- /* hash算法 */
- enum hash_alg
- {
- BOB_HASH,
- ONEATATIME_HASH,
- TIME33_HASH,
- EXTEND_HASH, // 外部提供的hash算法
- };
- /* hash表类型(实现方式) */
- #define CHAIN_H 0U // chain hash (ch)
- /* hash算法外部扩展函数指针 */
- typedef uint32_t (*hash_ex_func_hash)(const unsigned char *key, uint32_t keylen);
- /* key字比较外部扩展函数指针 */
- typedef int32_t (*hash_ex_func_cmp)(const void *key1, int32_t key1len, const void *key2, int32_t key2len);
- /* data空间释放回调函数 */
- typedef void (*hash_data_free_cb)(void *data);
- /* visit遍历回调函数 */
- typedef void (*hash_visit_cb)(const void *key, int32_t keylen, void *data);
- /* hash表 */
- typedef struct shash_t *hash_t;
- #ifdef __cplusplus
- extern "C"
- {
- #endif
- /**
- * @brief 创建一个HASH表
- *
- * @param[in] size hash表长度
- * @param[in] keysize 关键字长度, 默认0为变长
- * @param[in] alg hash算法
- * @param[in] hfunc 扩展的hash算法函数, "alg"为"EXTEND_HASH"时有效
- * @param[in] cfunc 扩展的关键字比较函数, 默认NULL为逐字符比较
- * @param[in] fcb data空间释放回调函数
- * @param[in] flag hash碰撞冲突处理方式, 默认0为"CHAIN_H"
- *
- * @return hash_t
- * @retval NULL 申请失败
- */
- 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);
- /**
- * @brief 添加一条记录
- *
- * @param[in] htable 哈希表
- * @param[in] key 关键字
- * @param[in] keylen 关键字长度
- * @param[in] data 数据
- *
- * @return 0 成功
- * @retval -1 添加失败
- */
- int32_t sw_hash_insert(hash_t htable, const void *key, int32_t keylen, const void *data);
- /**
- * @brief 删除一条记录
- *
- * @param[in] htable 哈希表
- * @param[in] key 关键字
- * @param[in] keylen 关键字长度
- * @param[in] bAutoFreeData 是否自动调用创建hash表时设定的"hash_data_free_cb"回调函数释放数据内存
- *
- * @return 0 成功
- * @retval -1 删除失败
- */
- int32_t sw_hash_delete(hash_t htable, const void *key, int32_t keylen, bool bAutoFreeData);
- /**
- * @brief 替换key的data值
- *
- * @param[in] htable 哈希表
- * @param[in] key 关键字
- * @param[in] keylen 关键字长度
- * @param[in] newdata 替换值
- * @param[out] olddata 被替换字指针的指针(data associated to this data MUST be freed by the caller)
- *
- * @return 0 成功
- * @retval -1 替换失败
- */
- int32_t sw_hash_replace(hash_t htable, const void *key, int32_t keylen, const void *newdata, void **olddata);
- /**
- * @brief 查找一条记录
- *
- * @param[in] htable 哈希表
- * @param[in] key 关键字
- * @param[in] keylen 关键字长度
- *
- * @return data 成功,返回查找到的记录
- * @retval NULL 查找失败
- */
- void *sw_hash_lookup(hash_t htable, const void *key, int32_t keylen);
- /** @brief 取得一个hash表长度 */
- uint32_t sw_hash_getTableSize(hash_t htable);
- /** @brief 取得一个hash表已存在元素的数目 */
- uint32_t sw_hash_getElemsCnt(hash_t htable);
- /** @brief 取得一个hash表中元素发生碰撞的次数(mixed-value) */
- uint32_t sw_hash_getElemCollisionCnts(hash_t htable);
- /** @brief 遍历一个hash表 */
- void sw_hash_visit(hash_t htable, hash_visit_cb vcb);
- /** @breif 销毁一个hash表("bAutoFreeData"-是否自动调用创建hash表时设定的"hash_data_free_cb"回调函数释放数据内存) */
- void sw_hash_destroy(hash_t htable, bool bAutoFreeData);
- #ifdef __cplusplus
- }
- #endif
- #endif /* __SWHASH_H__ */
|