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;
  1. typedef struct {                    //hash初始化结构  
  2.     ngx_hash_t       *hash;         //指向待初始化的hash结构  
  3.     ngx_hash_key_pt   key;          //hash函数指针  
  4.   
  5.     ngx_uint_t        max_size;     //bucket的最大个数  
  6.     ngx_uint_t        bucket_size;  //每个bucket的空间  
  7.   
  8.     char             *name;         //该hash结构的名字(仅在错误日志中使用)  
  9.     ngx_pool_t       *pool;         //该hash结构从pool指向的内存池中分配  
  10.     ngx_pool_t       *temp_pool;    //分配临时数据空间的内存池  
  11. } ngx_hash_init_t;  //用于初始化hash

  1. typedef struct {                    //hash key结构  
  2.     ngx_str_t         key;          //key,为nginx的字符串结构  
  3.     ngx_uint_t        key_hash;     //由该key计算出的hash值(通过hash函数如ngx_hash_key_lc())  
  4.     void             *value;        //该key对应的值,组成一个键-值对<key,value>  
  5. } ngx_hash_key_t;  

1)hash初始化

hash初始化由ngx_hash_init()函数完成,其names参数是ngx_hash_key_t结构的数组,即键-值对<key,value>数组,nelts表示该数组元素的个数。因此,在调用该函数进行初始化之前,ngx_hash_key_t结构的数组是准备好的,如何使用,可以采用nginxngx_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'>可以是一个或多个。

 

posted on 2014-09-10 15:23  菜鸟基地  阅读(461)  评论(0)    收藏  举报

导航