ngx_hash.{c|h}实现了nginx里面比较重要的一个hash结构,这个在模块配置解析里经常被用到。该hash结构是只读的,仅在初始创建时可以给出保存在其中的key-val对儿,然后就只能进行“增删改查”操作了。

先来看一下hash结构的内存布局:

[cpp] view plaincopy print?
  1. typedef struct {
  2. ngx_hash_t       *hash;                  //指向待初始化的散列结构
  3. ngx_hash_key_pt   key;                   //为计算散列值用的函数指针
  4. ngx_uint_t        max_size;               //允许的最大bucket数量
  5. ngx_uint_t        bucket_size;             //为每个bucket允许占用的最大空间
  6. char             *name;                 //初始化的散列名称(尽在错误日志中使用)
  7. ngx_pool_t       *pool;                   //用于分配散列结构空间的内存池
  8. ngx_pool_t       *temp_pool;              //用于分配临时数据空间的内存池
  9. } 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相关推荐

  1. nginx 源码学习笔记(二)——nginx精粹-模块

    看了一点nginx的源码发现,nginx的模块思想确实吸引了我,也不得不佩服俄罗斯人的想问题方式,要分析nginx源码,首先要搞懂的就是nginx的模块思想以及相关的数据结构. 还记得我们上一次写的h ...

  2. nginx 源码学习笔记(十八)—— ngx_add_inherited_sockets 继承的sockets

    之前几节有讲过多进程的创建过程和子进程所处理的事情,今天要讲一下nginx里面main函数的另一个主要的操作ngx_add_inherited_sockets. ngx_add_inherited_s ...

  3. nginx 源码学习笔记(二十一)—— event 模块(二) ——事件驱动核心ngx_process_events_and_timers

    首先继续回忆下,之前子线程执行操作里面有一个未涉及的内容ngx_process_events_and_timers,今天我们就来研究下这个函数. 本篇文章来自于:http://blog.csdn.ne ...

  4. Vuex 4源码学习笔记 - 通过Vuex源码学习E2E测试(十一)

    在上一篇笔记中:Vuex 4源码学习笔记 - 做好changelog更新日志很重要(十) 我们学到了通过conventional-changelog来生成项目的Changelog更新日志,通过更新日志 ...

  5. Apache log4j-1.2.17源码学习笔记

    (1)Apache log4j-1.2.17源码学习笔记 http://blog.csdn.net/zilong_zilong/article/details/78715500 (2)Apache l ...

  6. Vuex 4源码学习笔记 - 通过dispatch一步步来掌握Vuex整个数据流(五)

    在上一篇笔记中:Vuex 4源码学习笔记 - Store 构造函数都干了什么(四) 我们通过查看Store 构造函数的源代码可以看到主要做了三件事情: 初始化一些内部变量以外 执行installMod ...

  7. Java多线程之JUC包:Semaphore源码学习笔记

    若有不正之处请多多谅解,并欢迎批评指正. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/go2sea/p/5625536.html Semaphore是JUC ...

  8. nginx源码学习资源

    nginx源码学习是一个痛苦又快乐的过程,下面列出了一些nginx的学习资源. 首先要做的当然是下载一份nginx源码,可以从nginx官方网站下载一份最新的. 看了nginx源码,发现这是一份完全没 ...

  9. RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的?

    RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 文章目录 RocketMQ 源码学习笔记 Producer 是怎么将消息发送至 Broker 的? 前言 项目 ...

最新文章

  1. 【Smobiler企业APP开发之一】开发环境部署
  2. R语言ggplot2可视化使用ggsave将可视化图像结果保存为SVG文件实战
  3. 唐山一个葬礼上的豪华车队
  4. SqlServer英文单词全字匹配
  5. linux乌班图vi怎么使用,Ubuntu上vi(vim)编辑器使用教程
  6. C#读取Excel表格数据到DataGridView中和导出DataGridView中的数据到Excel
  7. centos6.x redhat6.x 升级openssh8.7
  8. Oracle 实用技巧
  9. Python typing —— 类型提示(type hint)
  10. matlab中的turbo码,基于Matlab的Turbo码仿真研究
  11. thinkphp LoginAction.class.php 登录模块
  12. 判断浏览器是否为IE
  13. 读庄子-万物齐一和自然无为
  14. hadoop中HDFS的NameNode原理
  15. ECS 7天实践训练营-day1
  16. intellidea 应用问题
  17. Bacteria(优先队列)
  18. Python-Unicode
  19. python爬虫----汽车之家的汽车论坛的最新精华帖
  20. MoveIt编程实现关节空间机械臂运动(逆运动学)

热门文章

  1. json_decode
  2. Wormholes--POJ 3259
  3. 智能布线系统,“智”在何方
  4. 2020-2021年度第二届全国大学生算法设计与编程挑战赛 (春季赛)- 天才的操作(线段树+主席树+树上倍增)
  5. 中石油训练赛 - 独居(二分水题)
  6. java定时增量同步,一种可配置的定时数据同步方法与流程
  7. python爬虫-初步使用Scrapy分布式爬虫(爬取mcbbs整合包保存名称及主要mod),大爱MC
  8. 迭代加深搜索与埃及分数求解
  9. HDU1506(天然的笛卡尔树)
  10. 线段树求区间最大值RMQ(单点更新)