Nginx源码初探之数据结构 - 哈希数据结构

本文深入探讨了Nginx中的两种Hash数据结构:ngx_hash_t和ngx_hash_wildcard_t,及其在配置数据存储中的应用。文章详细介绍了Hash结构的初始化方法,以及如何通过这些结构提高内存利用率和查询效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Nginx哈希数据结构介绍

         Nginx中的hash数据结构主要用来存储配置数据,比如url=ip的映射关系。Nginx中只提供了初始化的方法,也就是Hash结构一旦初始化后是不允许修改的,这样一方面提高了内存的利用率,另一方面提高了查询效率。

Nginx实现了两类Hash结构,一类是ngx_hash_wildcard_t通过指针指向具体数据,一类是ngx_hash_t。

1.数据结构

typedef struct {
    void             *value;/*value部分,可以指向具体的值,也可以是另一hash表的指针*/
    u_short           len;  /*key的长度*/
    u_char            name[1];/*key的字符串,在结构体中表现为字符数组*/
} ngx_hash_elt_t;
//基础Hash表
typedef struct {
    ngx_hash_elt_t  **buckets;/*桶的起始地址,实际相当与二维数组头的地址*/
    ngx_uint_t        size;/*桶的长度*/
} ngx_hash_t;

//通配符Hash表
typedef struct {
    ngx_hash_t        hash;/*基本Hash表,hash数据的存储结构*/
    void             *value;/*用户数据指针*/
} ngx_hash_wildcard_t;
//联合Hash表,既可以精准匹配,又可以通配符匹配
typedef struct {
    ngx_hash_t            hash;
    ngx_hash_wildcard_t  *wc_head;
    ngx_hash_wildcard_t  *wc_tail;
} ngx_hash_combined_t;

2.Hash数据管理hash

数据管理主要就是Hash结构的初始化,hash数据管理,参照ngx_hash_init_t进行,具体参考注释。

主要数据结构

typedef struct {
    ngx_hash_t       *hash;/*待建Hash结构*/
    ngx_hash_key_pt   key;/*Hash函数指针*/

    ngx_uint_t        max_size;/*桶的最大值*/
    ngx_uint_t        bucket_size;/*每个桶最大存放数据*/

    char             *name;/*Hash结构名字,主要是日志中容易区分*/
    ngx_pool_t       *pool;/*构建Hash所用的内存池*/
    ngx_pool_t       *temp_pool;/*构建hash所用的临时内存池,用于结构构建过程中交换数据*/
} ngx_hash_init_t;

         ngx_hash_key_t,主要用来存放构建hash表的数据,包含key值,key对应的hash值,value值对应的指针地址,构建Hash结构时,作为一个键值对参数传递。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值