由于C语言中缺乏像C++中的数据容器,所以用C语言自己对hashtable做了一个前期的原理分析及函数定义,以备自己以后查用。字符串的hash处理采用lua源码中的luaS_hash函数。
hash数据存储模块:(如果两个key值一模一样则存储在同一个节点的单向链表hash_value 中,当节点数达到申请的节点数,则将节点数翻倍重新计算节点在table中的存储位置)
hash数据结构:
struct hash_value {
union{
uint32_t k_num;
char k_char[32]; //最大支持32个字节的key值长度
}key;
void * data; //数据存储位置
struct hash_value *next; //同一个hash值的数据存储链表
};
typedef struct hash_tab {
struct hash_value ** hash;
uint32_t nuse; //hashtab中已插入的数据条数
uint32_t size; //当前hashtab的大小。
}hash_tab;
通过采用key-value的方式,key支持int,string类型数据,value为void*类型。hash函数采用luaS_hash函数原型。
提供创建: hash_create(hash_tab *tab, uint32_t size)
修改tab大小:hash_resize(hash_tab *tab, uint32_t newsize)
插入: hash_insert