您的位置:首页 > 运维架构 > Nginx

ngx_hash_combined_t,ngx_hash_keys_arrays_t

2016-08-02 17:47 295 查看
 通过上一篇文章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;
//存放普通的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;

结构体很明显,存放公共参数之后,存放三个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提供的方法查找。或者自己想怎么用,就怎么用。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx hash