Nginx数据结构(二)——ngx_array_t、ngx_hash_t

ngx_array_t

ngx_array_t是Nginx内部使用的数组结构

typedef struct ngx_array_s ngx_array_t;
struct ngx_array_s
{
   
	void 		*elts;		//实际的数据存储区域
	ngx_uint_t 	nelts;		//数据实际个数
	size_t 		size;		//数组单个元素大小
	ngx_uint_t	nalloc;		//数组的最大容量
	ngx_pool_t	*pool;		//用来分配内存的内存池
};

注意:
数组在扩容的时候,旧内存不会被释放

相关操作API

ngx_array_t* ngx_array_create(ngx_pool_t* p, ngx_uint_t n, size_t size);
/*创建一个新的数组对象,并返回这个对象 * p 内存池 * n 数组的初始容量大小 * size 单个元素的大小 */
void ngx_array_destory(ngx_array_t* a);
//销毁该数组对象,并释放其分配的内存池
void* ngx_array_push(ngx_array_t* a);
//在数组a上新追加一个元素,并返回指向新元素的指针,然后再赋值
void* ngx_array_push_n(ngx_arr_t* a, ngx_uint_t n);
//在数组a上追加n个元素,并返回指向这些追加元素的首个元素的位置的指针
static ngx_inline ngx_int_t ngx_array_init(ngx_arrat_t* array, ngx_pool_t* pool, ngx_uint_t n, size_t size);
//如果一个数组对象是被分配在堆上,那么当调用ngx_array_destory销毁后,如果还想再次使用,就可以调用次函数
//如果是栈上,就需要调用此函数,进行初始化后,才可以使用

ngx_hash_t

ngx_hash_t是Nginx自己的哈希表实现。
其对解决冲突的方法使用的是最常用的开链法

但是需要注意以下几点:

  • ngx_hash_t不像其他的hash表实现,它只能一次初始化,然后就不能删除和插入。
  • 其并不是真正的开了一个链表,而是开了一段连续的存储空间,几乎可以看做一个数组。

所以说,ngx_hash_t的使用只有两步:初始化、查找。

相关操作API

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的个数 */

typedef struct
{
   
	ngx_hash_t		*hash;		//如果字段为NULL,调用后就指向新创建出来的hash表
	ngx_hash_key_pt	key;		//指向从字符串生成的hash值的hash函数
	
	ngx_uint_t		max_size;	//hash表中桶的个数
	ngx_uint_t		bucket_size;//每个桶的最大限制大小

	char			*name;		//该hash表达到名字
	ngx_pool_t		*pool;		//hash表分配内存使用的pool
	ngx_pool_t		*temp_pool;	//hash使用的临时pool
}

typedef struct
{
   
	ngx_str_t		key;
	ngx_uint_t		key_hash;
	void			*value;
}ngx_hash_key_t;
void* ngx_hash_find(ngx_hash_t* hashm ngx_uint_t key, u_char* name, size_t len);
/*在hash里面查找key对应的value * key 对真正的key计算出的hash值 * len name长度 */

参考文献

[1] Nginx开发从入门到精通
全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务