Nginx哈希数据结构介绍
Nginx中的hash数据结构主要用来存储配置数据,比如url=ip的映射关系。Nginx中只提供了初始化的方法,也就是Hash结构一旦初始化后是不允许修改的,这样一方面提高了内存的利用率,另一方面提高了查询效率。
Nginx实现了两类Hash结构,一类是ngx_hash_wildcard_t通过指针指向具体数据,一类是ngx_hash_t。
1.数据结构
typedef struct {
void *value;/*value部分,可以指向具体的值,也可以是另一hash表的指针*/
u_short len; /*key的长度*/
u_char name[1];/*key的字符串,在结构体中表现为字符数组*/
} ngx_hash_elt_t;
//基础Hash表
typedef struct {
ngx_hash_elt_t **buckets;/*桶的起始地址,实际相当与二维数组头的地址*/
ngx_uint_t size;/*桶的长度*/
} ngx_hash_t;
//通配符Hash表
typedef struct {
ngx_hash_t hash;/*基本Hash表,hash数据的存储结构*/
void *value;/*用户数据指针*/
} ngx_hash_wildcard_t;
//联合Hash表,既可以精准匹配,又可以通配符匹配
typedef struct {
ngx_hash_t hash;
ngx_hash_wildcard_t *wc_head;
ngx_hash_wildcard_t *wc_tail;
} ngx_hash_combined_t;
2.Hash数据管理hash
数据管理主要就是Hash结构的初始化,hash数据管理,参照ngx_hash_init_t进行,具体参考注释。
主要数据结构
typedef struct {
ngx_hash_t *hash;/*待建Hash结构*/
ngx_hash_key_pt key;/*Hash函数指针*/
ngx_uint_t max_size;/*桶的最大值*/
ngx_uint_t bucket_size;/*每个桶最大存放数据*/
char *name;/*Hash结构名字,主要是日志中容易区分*/
ngx_pool_t *pool;/*构建Hash所用的内存池*/
ngx_pool_t *temp_pool;/*构建hash所用的临时内存池,用于结构构建过程中交换数据*/
} ngx_hash_init_t;
ngx_hash_key_t,主要用来存放构建hash表的数据,包含key值,key对应的hash值,value值对应的指针地址,构建Hash结构时,作为一个键值对参数传递。