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提供的方法查找。或者自己想怎么用,就怎么用。
先看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源码分析2———基础数据结构六(ngx_hash_keys_arrays_t)
- Nginx基本数据结构之ngx_hash_keys_arrays_t
- Nginx基本数据结构之ngx_hash_combined_t
- Improve performance using hash keys
- Joining an array of keys to a hash with key value pairs like excel vlookup
- Change Hash Array keys to strings
- nginx源码分析—hash结构ngx_hash_t(v1.0.4)
- 菜鸟nginx源码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)
- Nginx源码阅读(ngx_hash_t)
- Perl Learning - 11 (hash keys, values, each, exists, delete)
- Nginx源码分析 - 基础数据结构篇 - hash表结构 ngx_hash.c
- Boost performance and use less disk space with hash keys
- zunionstore异常:CROSSSLOT Keys in request don't hash to the same slot
- nginx源码分析—hash结构ngx_hash_t(v1.0.4)
- Nginx源码分析---hash结构ngx_hash_t(v1.0.4)
- Nginx高效数据结构(4)——Hash表(ngx_hash_t)
- nginx 负载均衡之 ngx_http_upstream_hash_module
- 菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)
- nginx 负载均衡之 ngx_http_upstream_hash_module
- ngx_hash散列表