ngx_hash_t是nginx自己的hash表的实现。定义和实现位于src/core/ngx_hash.h|c中。ngx_hash_t的实现也与数据结构教课书上所描述的hash表的实现是大同小异。对于常用的解决冲突的方法有线性探测,二次探测和开链法等。ngx_hash_t使用的是最常用的一种,也就是开链法,这也是STL中的hash表使用的方法。

但是ngx_hash_t的实现又有其几个显著的特点:

  1. ngx_hash_t不像其他的hash表的实现,可以插入删除元素,它只能一次初始化,就构建起整个hash表以后,既不能再删除,也不能在插入元素了。
  2. ngx_hash_t的开链并不是真的开了一个链表,实际上是开了一段连续的存储空间,几乎可以看做是一个数组。这是因为ngx_hash_t在初始化的时候,会经历一次预计算的过程,提前把每个桶里面会有多少元素放进去给计算出来,这样就提前知道每个桶的大小了。那么就不需要使用链表,一段连续的存储空间就足够了。这也从一定程度上节省了内存的使用。

从上面的描述,我们可以看出来,实际上ngx_hash_t的使用是非常简单。就两步,首先是初始化,然后就可以在里面进行查找了。下面我们详细来看一下。

ngx_hash_t的初始化。

   ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
ngx_uint_t nelts);

首先我们来看一下初始化函数。该函数的第一个参数hinit是初始化的一些参数的一个集合。 names是初始化一个ngx_hash_t所需要的所有key的一个数组。而nelts就是key的个数。下面先看一下ngx_hash_init_t类型,该类型提供了初始化一个hash表所需要的一些基本信息。

typedef struct {ngx_hash_t       *hash;ngx_hash_key_pt   key;ngx_uint_t        max_size;ngx_uint_t        bucket_size;char             *name;ngx_pool_t       *pool;ngx_pool_t       *temp_pool;
} ngx_hash_init_t;
hash: 该字段如果为NULL,那么调用完初始化函数后,该字段指向新创建出来的hash表。如果该字段不为NULL,那么在初始的时候,所有的数据被插入了这个字段所指的hash表中。
key: 指向从字符串生成hash值的hash函数。nginx的源代码中提供了默认的实现函数ngx_hash_key_lc。
max_size: hash表中的桶的个数。该字段越大,元素存储时冲突的可能性越小,每个桶中存储的元素会更少,则查询起来的速度更快。当然,这个值越大,越造成内存的浪费,(实际上也浪费不了多少)。
bucket_size: 每个桶的最大限制大小,单位是字节。如果在初始化一个hash表的时候,发现某个桶里面无法存的下所有属于该桶的元素,则hash表初始化失败。
name: 该hash表的名字。
pool: 该hash表分配内存使用的pool。
temp_pool: 该hash表使用的临时pool,在初始化完成以后,该pool可以被释放和销毁掉。

下面来看一下存储hash表key的数组的结构。

typedef struct {ngx_str_t         key;ngx_uint_t        key_hash;void             *value;
} ngx_hash_key_t;

key和value的含义显而易见,就不用解释了。key_hash是对key使用hash函数计算出来的值。 对这两个结构分析完成以后,我想大家应该都已经明白这个函数应该是如何使用了吧。该函数成功初始化一个hash表以后,返回NGX_OK,否则返回NGX_ERROR。

void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len);

在hash里面查找key对应的value。实际上这里的key是对真正的key(也就是name)计算出的hash值。len是name的长度。

如果查找成功,则返回指向value的指针,否则返回NULL。

Nginx基本数据结构之ngx_hash_t相关推荐

  1. Nginx学习笔记(三) Nginx基本数据结构

    话说学习一种编程语言,例如C语言,我们首先学的也是数据结构,这是以后开发程序的关键.为了更好更方便的开发Nginx,Nginx自己实现了很多适合nginx的数据结构. Nginx中的数组 ngx_ar ...

  2. Nginx基本数据结构之ngx_hash_keys_arrays_t

    大家看到在构建一个ngx_hash_wildcard_t的时候,需要对通配符的哪些key进行预处理.这个处理起来比较麻烦.而当有一组key,这些里面既有无通配符的key,也有包含通配符的key的时候. ...

  3. nginx基本数据结构ngx_module_t,ngx_module_s

    ngx_module_t是nginx的模块化架构最基本的数据结构.  其结构定义如下,其中的注释为功能说明: struct ngx_module_s { ngx_uint_t            c ...

  4. Nginx基本数据结构之ngx_buf_t

    这个ngx_buf_t就是这个ngx_chain_t链表的每个节点的实际数据.该结构实际上是一种抽象的数据结构,它代表某种具体的数据.这个数据可能是指向内存中的某个缓冲区,也可能指向一个文件的某一部分 ...

  5. Nginx基本数据结构之ngx_hash_combined_t

    组合类型hash表,该hash表的定义如下: typedef struct {ngx_hash_t hash;ngx_hash_wildcard_t *wc_head;ngx_hash_wildcar ...

  6. Nginx基本数据结构之ngx_hash_wildcard_t

    nginx为了处理带有通配符的域名的匹配问题,实现了ngx_hash_wildcard_t这样的hash表.他可以支持两种类型的带有通配符的域名.一种是通配符在前的,例如:"*.abc.co ...

  7. Nginx基本数据结构之ngx_pool_t

    ngx_pool_t是一个非常重要的数据结构,在很多重要的场合都有使用,很多重要的数据结构也都在使用它.那么它究竟是一个什么东西呢?简单的说,它提供了一种机制,帮助管理一系列的资源(如内存,文件等), ...

  8. Nginx基本数据结构之ngx_str_t

    nginx的作者为追求极致的高效,自己实现了很多颇具特色的nginx风格的数据结构以及公共函数.比如,nginx提供了带长度的字符串,根据编译器选项优化过的字符串拷贝函数ngx_copy等.所以,在我 ...

  9. nginx基本数据结构及接口

    简单的数据类型 在core/ngx_confing.h中定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型: typedef intptr_t        ngx_int_t; type ...

最新文章

  1. Please select Android SDK
  2. 华为浏览器推荐关闭_用华为手机这5个功能要关掉,越早越好,不然你的手机会变的卡顿...
  3. 新无限天空服务器,天空魔域3782版最新服务端(含网站程序)
  4. solaris11-text-安装GUI(gnome)
  5. 农委系统先进集体推荐报告_来自司法行政的他们,荣获上海档案系统表彰!
  6. Centos7 安装mysql 需要自己下载 rpm
  7. java char占用多少字节_Java虚拟机:Java对象大小、对象内存布局及锁状态变化
  8. 用c语言计算1+2+3+......+100
  9. dds通信中间件_车内的中间件协议:是面向服务,还是以数据为中心,或是RESTful?...
  10. 一天已不足24小时?一年不足365天?求每年元旦为周几的公式还能用吗?(标题党石锤了)
  11. matlab结构体、数组和单元数组类型的创建
  12. 十、PWM脉宽调制信号的发生与控制
  13. 一文读懂京东商城发展史
  14. 示例代码-协方差,黎曼协方差计算.
  15. The bean ‘employServiceImpl‘ could not be injected as a ‘com.itcast.reggie.service.impl.EmployServic
  16. 9008 能 解锁BL_【Android取证】一部锤子手机引起的解锁事件
  17. pickel加速caffe读图
  18. 初中语文教资,笔试技巧+面试技巧
  19. Linux CFS调度算法关键知识点
  20. 对于整数取反(取负NEG)运算的理解

热门文章

  1. java中CS和BS_BS与CS的联系与区别【简】
  2. linux下java连接mysql_LinuxJava连接MySQL数据库
  3. Linux赋予目录或文件任何人都可以读、写、执行的操作
  4. 关联分析算法(二)——FP-growth算法与python用法
  5. python函数注解
  6. wps怎么投递简历发到boss直聘_BOSS直聘角逐招聘季:装机量、下载增量、增长率三料冠军...
  7. 金蝶记账王登录显示连接金蝶云服务器异常,金蝶KIS记账王系统初始化常见问题...
  8. python程序是怎么构成的_python程序的构成
  9. hdu-2717(基础搜索bfs)
  10. padding/border与width的关系