nginx_hash表
typedef struct { //hash元素结构 void *value; //value,即某个key对应的值,即<key,value>中的value u_short len; //name长度 u_char name[1]; //某个要hash的数据(在nginx中表现为字符串),即<key,value>中的key } ngx_hash_elt_t; typedef struct { //hash结构 ngx_hash_elt_t **buckets; //hash桶(有size个桶) ngx_uint_t size; //hash桶个数 } ngx_hash_t;
- typedef struct { //hash初始化结构
- ngx_hash_t *hash; //指向待初始化的hash结构
- ngx_hash_key_pt key; //hash函数指针
- ngx_uint_t max_size; //bucket的最大个数
- ngx_uint_t bucket_size; //每个bucket的空间
- char *name; //该hash结构的名字(仅在错误日志中使用)
- ngx_pool_t *pool; //该hash结构从pool指向的内存池中分配
- ngx_pool_t *temp_pool; //分配临时数据空间的内存池
- } ngx_hash_init_t; //用于初始化hash
- typedef struct { //hash key结构
- ngx_str_t key; //key,为nginx的字符串结构
- ngx_uint_t key_hash; //由该key计算出的hash值(通过hash函数如ngx_hash_key_lc())
- void *value; //该key对应的值,组成一个键-值对<key,value>
- } ngx_hash_key_t;
1)hash初始化
hash初始化由ngx_hash_init()函数完成,其names参数是ngx_hash_key_t结构的数组,即键-值对<key,value>数组,nelts表示该数组元素的个数。因此,在调用该函数进行初始化之前,ngx_hash_key_t结构的数组是准备好的,如何使用,可以采用nginx的ngx_array_t结构。
该函数初始化的结果就是将names数组保存的键-值对<key,value>,通过hash的方式将其存入相应的一个或多个hash桶(即代码中的buckets)中,该hash过程用到的hash函数一般为ngx_hash_key_lc等。hash桶里面存放的是ngx_hash_elt_t结构的指针(hash元素指针),该指针指向一个基本连续的数据区。该数据区中存放的是经hash之后的键-值对<key',value'>,即ngx_hash_elt_t结构中的字段<name,value>。每一个这样的数据区存放的键-值对<key',value'>可以是一个或多个。
浙公网安备 33010602011771号