nginx hash源码
以下是Nginx的哈希源代码的简化版本:
#include <ngx_core.h>
typedef struct {
ngx_str_t key;
ngx_str_t value;
u_short len;
u_char name[1];
} ngx_hash_elt_t;
typedef struct {
ngx_hash_elt_t **buckets;
ngx_uint_t size;
} ngx_hash_t;
ngx_uint_t
ngx_hash_key(u_char *data, size_t len)
{
ngx_uint_t i, hash;
hash = 0;
for (i = 0; i < len; i++) {
hash = ngx_hash(hash, data[i]);
}
return hash;
}
ngx_int_t
ngx_hash_init(ngx_hash_t *hash, ngx_hash_elt_t **buckets, ngx_uint_t size)
{
hash->buckets = buckets;
hash->size = size;
return NGX_OK;
}
ngx_hash_elt_t *
ngx_hash_find(ngx_hash_t *hash, ngx_str_t *key, ngx_uint_t hash_value)
{
ngx_hash_elt_t *elt;
elt = hash->buckets[hash_value % hash->size];
while (elt) {
if (elt->len == key->len && ngx_strncmp(elt->name, key->data, key->len) == 0) {
return elt;
}
elt = elt->next;
}
return NULL;
}
ngx_int_t
ngx_hash_add(ngx_hash_t *hash, ngx_str_t *key, ngx_str_t *value)
{
ngx_uint_t hash_value;
ngx_hash_elt_t *elt;
hash_value = ngx_hash_key(key->data, key->len);
elt = ngx_hash_find(hash, key, hash_value);
if (elt) {
elt->value = *value;
return NGX_OK;
}
elt = ngx_pcalloc(hash->pool, sizeof(ngx_hash_elt_t) + key->len);
elt->len = (u_short) key->len;
ngx_memcpy(elt->name, key->data, key->len);
elt->value = *value;
elt->next = hash->buckets[hash_value % hash->size];
hash->buckets[hash_value % hash->size] = elt;
return NGX_OK;
}
这是Nginx中用于哈希实现的一些简化的源代码。这些代码定义了ngx_hash_t和ngx_hash_elt_t结构体,包括哈希表的初始化、查找和添加操作。ngx_hash_key函数用于计算哈希值,ngx_hash_init函数用于初始化哈希表,ngx_hash_find函数用于在哈希表中查找元素,ngx_hash_add函数用于向哈希表中添加元素。
需要注意的是,这只是源代码的简化版本,实际的Nginx源代码包含了更多的细节和实现
原文地址: https://www.cveoy.top/t/topic/ighP 著作权归作者所有。请勿转载和采集!