ngx_hash_combined_t,ngx_hash_keys_arrays_t


 通过上一篇文章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;


很简洁的一个结构体,就是帮我们准个三个放不同内容的hash 并且提供一个方法来统一查询,这样咱们就可以不用管去哪里查询了,他会依次查询,然后给我们返回结果

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; //存放普通的hashngx_hash_key_t

    ngx_array_t      *keys_hash; //这是一个二维数组用来校验是否输入了重复的key

    /*

        第一维为 keyhashvalue %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;


结构体很明显,存放公共参数之后,存放三个keys.

来看提供的方法

初始化

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提供的方法查找。或者自己想怎么用,就怎么用。


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值