nginx源码分析(1):hash的使用

时间:2022-09-01 22:55:34

在nginx源码中提供了一个比较重要的hash结构,可以为我们带来高效的kv查找。该hash的实现比较简单,但却非常的高效。该hash结构是只读的,在创建之后,以后只能提供查询功能。

该hash结构体,刚开始理解起来比较费劲,而且在使用时也会有不爽的感觉,需要好几个结构体,以及好几个函数配合才能完成初始化及查找。在本文中,对于通配符的使用,我们先不作介绍。

 

我们先看看如何使用吧。

创建一个hash结构体的过程是:

1. 构造一个ngx_hash_key_t为成员的数组,然后用我们需要hash的key、value以及计算出来的hash值来初始化该数组的每一个成员。

2. 构建一个 ngx_hash_init_t结构体的变量, 其中包含了ngx_hash_t 的成员, 为hash的结构体, 还包括一些其他初始设置,如bucket的大小,内存池等。该hash结构体会在ngx_hash_init中创建及初始化。

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的指针。

 

看起来似乎还比较简单,示例代码来段:

 

接下来我们来分析下源码,先介绍几个结构体:

 

 

 

 

在熟悉了结构体之后,我先给大家看看hash在内存中的存放布局,看图:

 

nginx源码分析(1):hash的使用

接下来,我们来看看复杂的ngx_hash_init函数:

 

ngx_hash_find提供hash查找:

 

好,先介绍到这,最后感谢http://code.google.com/p/nginxsrp/wiki/NginxCodeReview所提供的帮助及图文!