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开发从入门到精通