nginx 源码学习笔记(十)——基本容器——ngx_hash
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 对数量成反比
ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n);
将字符串转换成小写
nginx 源码学习笔记(十)——基本容器——ngx_hash相关推荐
- nginx 源码学习笔记(二)——nginx精粹-模块
看了一点nginx的源码发现,nginx的模块思想确实吸引了我,也不得不佩服俄罗斯人的想问题方式,要分析nginx源码,首先要搞懂的就是nginx的模块思想以及相关的数据结构. 还记得我们上一次写的h ...
- nginx 源码学习笔记(十八)—— ngx_add_inherited_sockets 继承的sockets
之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets. ngx_add_inherited_s ...
- nginx 源码学习笔记(二十一)—— event 模块(二) ——事件驱动核心ngx_process_events_and_timers
首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数. 本篇文章来自于:http://blog.csdn.ne ...
- Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)
在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...
- Apache log4j-1.2.17源码学习笔记
(1)Apache log4j-1.2.17源码学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78715500 (2)Apache l ...
- Vuex 4源码学习笔记 - 通过dispatch一步步来掌握Vuex整个数据流(五)
在上一篇笔记中:Vuex 4源码学习笔记 - Store 构造函数都干了什么(四) 我们通过查看Store 构造函数的源代码可以看到主要做了三件事情: 初始化一些内部变量以外 执行installMod ...
- Java多线程之JUC包:Semaphore源码学习笔记
若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...
- nginx源码学习资源
nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...
- RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?
RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...
最新文章
- 【Smobiler企业APP开发之一】开发环境部署
- R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战
- 唐山一个葬礼上的豪华车队
- SqlServer英文单词全字匹配
- linux乌班图vi怎么使用,Ubuntu上vi(vim)编辑器使用教程
- C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
- centos6.x redhat6.x 升级openssh8.7
- Oracle 实用技巧
- Python typing —— 类型提示(type hint)
- matlab中的turbo码,基于Matlab的Turbo码仿真研究
- thinkphp LoginAction.class.php 登录模块
- 判断浏览器是否为IE
- 读庄子-万物齐一和自然无为
- hadoop中HDFS的NameNode原理
- ECS 7天实践训练营-day1
- intellidea 应用问题
- Bacteria(优先队列)
- Python-Unicode
- python爬虫----汽车之家的汽车论坛的最新精华帖
- MoveIt编程实现关节空间机械臂运动(逆运动学)
热门文章
- json_decode
- Wormholes--POJ 3259
- 智能布线系统,“智”在何方
- 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)
- 中石油训练赛 - 独居(二分水题)
- java定时增量同步,一种可配置的定时数据同步方法与流程
- python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
- 迭代加深搜索与埃及分数求解
- HDU1506(天然的笛卡尔树)
- 线段树求区间最大值RMQ(单点更新)