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 对数量成反比

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值