nginx 源码学习笔记(十)——基本容器——ngx_hash
2015-12-05 14:55
801 查看
ngx_hash.{c|h}实现了nginx里面比较重要的一个hash结构,这个在模块配置解析里经常被用到。该hash结构是只读的,仅在初始创建时可以给出保存在其中的key-val对儿,然后就只能进行“增删改查”操作了。
先来看一下hash结构的内存布局:
![](http://hi.csdn.net/attachment/201203/15/0_1331801083FjRc.gif)
[cpp] view
plaincopyprint?
typedef struct {
ngx_hash_t *hash; //指向待初始化的散列结构
ngx_hash_key_pt key; //为计算散列值用的函数指针
ngx_uint_t max_size; //允许的最大bucket数量
ngx_uint_t bucket_size; //为每个bucket允许占用的最大空间
char *name; //初始化的散列名称(尽在错误日志中使用)
ngx_pool_t *pool; //用于分配散列结构空间的内存池
ngx_pool_t *temp_pool; //用于分配临时数据空间的内存池
} ngx_hash_init_t;
具体含义还要看图理解。这里不解析代码了,虽然看着繁琐,但是用起来还是相当方便。
一般操作有,创建hash和hash中进行查找。
创建hash:
1.构造一个 ngx_hash_key_t 为成员的数组, 包含 key, value和 使用key计算出的一个hash值
2.构建一个 ngx_hash_init_t结构体的变量, 其中包含了ngx_hash_t的成员, 为hash的结构体, 还包括一些其他初始设置,如bucket的大小,内存池等
3.调用 ngx_hash_init 传入ngx_hash_init_t 结构, ngx_hash_key_t 的数组,和数组的长度,进行初始化,这样 ngx_hash_init_t的hash成员就是我们要的hash结构
查找的过程很简单
1.计算 key 的hash值
2.使用 ngx_hash_find 进行查找,需要同时传入hash值和key ,返回的就是value的指针
需要注意的是,nginx 的 hash 在查找时使用的是分桶后线性查找法,因此当分桶数确定时查找效率同其中的总 key-val 对数量成反比
先来看一下hash结构的内存布局:
![](http://hi.csdn.net/attachment/201203/15/0_1331801083FjRc.gif)
[cpp] view
plaincopyprint?
typedef struct {
ngx_hash_t *hash; //指向待初始化的散列结构
ngx_hash_key_pt key; //为计算散列值用的函数指针
ngx_uint_t max_size; //允许的最大bucket数量
ngx_uint_t bucket_size; //为每个bucket允许占用的最大空间
char *name; //初始化的散列名称(尽在错误日志中使用)
ngx_pool_t *pool; //用于分配散列结构空间的内存池
ngx_pool_t *temp_pool; //用于分配临时数据空间的内存池
} ngx_hash_init_t;
具体含义还要看图理解。这里不解析代码了,虽然看着繁琐,但是用起来还是相当方便。
一般操作有,创建hash和hash中进行查找。
创建hash:
1.构造一个 ngx_hash_key_t 为成员的数组, 包含 key, value和 使用key计算出的一个hash值
2.构建一个 ngx_hash_init_t结构体的变量, 其中包含了ngx_hash_t的成员, 为hash的结构体, 还包括一些其他初始设置,如bucket的大小,内存池等
3.调用 ngx_hash_init 传入ngx_hash_init_t 结构, ngx_hash_key_t 的数组,和数组的长度,进行初始化,这样 ngx_hash_init_t的hash成员就是我们要的hash结构
查找的过程很简单
1.计算 key 的hash值
2.使用 ngx_hash_find 进行查找,需要同时传入hash值和key ,返回的就是value的指针
需要注意的是,nginx 的 hash 在查找时使用的是分桶后线性查找法,因此当分桶数确定时查找效率同其中的总 key-val 对数量成反比
相关文章推荐
- nginx代理指定目录
- 访问Nginx发生SSL connection error的一种情况
- Nginx+Naxsi部署专业级Web应用防火墙
- CentOS 6.2实战部署Nginx+MySQL+PHP
- nginx中http核心模块的配置指令2
- nginx中http核心模块的配置指令3
- nginx中http核心模块的配置指令4
- nginx中http的fastcgi模块的配置指令1
- Nginx 学习笔记(一)
- 网站502与504错误分析
- 艰难完成 nginx + puma 部署 rails 4的详细记录
- 把Lua编译进nginx步骤方法
- web 应用中常用的各种 cache详解
- Linux系统上配置Nginx+Ruby on Rails+MySQL超攻略
- window+nginx+php环境配置 附配置搭配说明
- 解析CI即CodeIgniter框架在Nginx下的重写规则
- 将PHP从5.3.28升级到5.3.29时Nginx出现502错误
- 基于Nginx0.8.54+PHP5.3.4+MySQL5.5.8的全新LNMP稳定版架构搭建的VPS
- Nginx(PHP/fastcgi)的PATH_INFO问题