nginx 源码学习笔记(十)——基本容器——ngx_hash
来源:互联网 发布:网络威胁别人什么罪 编辑:程序博客网 时间:2024/05/16 13:02
ngx_hash.{c|h}实现了nginx里面比较重要的一个hash结构,这个在模块配置解析里经常被用到。该hash结构是只读的,仅在初始创建时可以给出保存在其中的key-val对儿,然后就只能进行“增删改查”操作了。
先来看一下hash结构的内存布局:
- 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 对数量成反比
0 0
- nginx 源码学习笔记(十)——基本容器——ngx_hash
- nginx 源码学习笔记(十)——基本容器——ngx_hash
- nginx 源码学习笔记(十)——基本容器——ngx_hash
- nginx 源码学习笔记(八)——基本容器——array数组
- nginx 源码学习笔记(九)——基本容器——queue
- nginx 源码学习笔记(十一)——基本容器——ngx_list
- nginx 源码学习笔记(十二)——基本容器——ngx_buf
- nginx 源码学习笔记(八)——基本容器——array数组
- nginx 源码学习笔记(九)——基本容器——queue
- nginx 源码学习笔记(十一)——基本容器——ngx_list
- nginx 源码学习笔记(十二)——基本容器——ngx_buf
- nginx 源码学习笔记(六)——nginx基本数据结构
- nginx 源码学习笔记(六)——nginx基本数据结构
- nginx 源码学习笔记(二十)—— event 模块(一) ——初始化
- nginx 源码学习笔记(二十)—— event 模块(一) ——初始化
- Nginx学习笔记 —— 基本数据结构
- nginx 源码学习笔记(十四)—— 全局变量ngx_cycle
- nginx 源码学习笔记(十四)—— 全局变量ngx_cycle
- nginx 源码学习笔记(八)——基本容器——array数组
- 160.Oracle数据库SQL开发之 SQL优化——使用绑定变量
- nginx 源码学习笔记(九)——基本容器——queue
- 161.Oracle数据库SQL开发之 SQL优化——比较执行查询的成本
- 设计模式总结(一)
- nginx 源码学习笔记(十)——基本容器——ngx_hash
- 解决聊天输入框一直跳动的bug
- Ubuntu VirtualBox 命令行安装
- 162.Oracle数据库SQL开发之 SQL优化——优化器传递提示
- Lenovo笔记本各类型触控板,触摸部分只能移动无法点击的问题汇总
- Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭
- hdu 3966 Aragorn's Story 树链剖分
- nginx 源码学习笔记(十一)——基本容器——ngx_list
- 163.Oracle数据库SQL开发之 SQL优化——优化工具