通过上一篇文章ngx_hash_wildcard_t 我们发现 虽然这个功能不错,但是好像不是那么好用样。主要是我们还需要对通配字段进行转换啊那些,如果不知道的话,还不一定搞得定,所以nginx就给我们提供了结构体来帮我完成这个事情。
先看ngx_hash_combined_t
typedef struct {
ngx_hash_t hash; //普通hash
ngx_hash_wildcard_t *wc_head; //通配符在前
ngx_hash_wildcard_t *wc_tail;//通配符在后
} ngx_hash_combined_t;
void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key,
u_char *name, size_t len);
hash 结构体key name计算出来的hash值
name 进行查找的name
len name的长度。
结果就是依次查找,然后返回结果。
有了查找了,咱们还得有个构造时候的,关键是那个啥前匹配后匹配的构造。 来看下提供的方法。
先看结构体
:
typedef struct {
ngx_uint_t hsize; //大小
ngx_pool_t *pool; //内存pool
ngx_pool_t *temp_pool; //临时pool
ngx_array_t keys; //存放普通的hash的ngx_hash_key_t
ngx_array_t *keys_hash; //这是一个二维数组用来校验是否输入了重复的key
/*
第一维为 key的hashvalue %size 然后 第二维存放都是这个取模结果下的所有key
比如 key1 key2 key3 他们的hashvalue取模都是i 然后他们存放的内容就是keys_hash[i][0] = key1.key
keys_hash[i][1] = key2.key keys_hash[i][2] = key3.key
后面两个用法一样
*/
ngx_array_t dns_wc_head;//存放处理后的向前key *.www.xxx 已经被处理成 xxx.www.
ngx_array_t *dns_wc_head_hash;
ngx_array_t dns_wc_tail; //存放处理后的向后的key www.xxx.* 已经被处理成 www.xxx.
ngx_array_t *dns_wc_tail_hash;
} ngx_hash_keys_arrays_t;
来看提供的方法
初始化
ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);
//ha 结构体指针//type 这个字段有两个值主要是 建立hash表的size的大小NGX_HASH_SMALL NGX_HASH_LARGE
这个方法也主要就是设置表的大小和初始化变量。
增加key的方法
ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key,
void *value, ngx_uint_t flags);
//ha 结构体指针
//key key
//value value
//flags flags 这个有两个值 NGX_HASH_WILDCARD_KEY 和 NGX_HASH_READONLY_KEY 一个代表是通配符的key 一个代表是原样保存我的key。两个可以|操作同时存在或者是0
这个方法会自动判断我们key的类型(主要是前匹配,还是后匹配),并且添加到对应的keys数组里去。
这个方法的内容 主要是字符串的操作,就不具体说了。
这里咱们就可以用ngx_hash_keys_arrays_t 和他的方法 得到keys 然后去构建ngx_hash_combined_t结构体, 然后用ngx_hash_combined_t提供的方法查找。或者自己想怎么用,就怎么用。