1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8#ifndef _NGX_HASH_H_INCLUDED_
9#define _NGX_HASH_H_INCLUDED_
10
11
12#include <ngx_config.h>
13#include <ngx_core.h>
14
15
16typedef struct {
17    void             *value;
18    u_short           len;
19    u_char            name[1];
20} ngx_hash_elt_t;
21
22
23typedef struct {
24    ngx_hash_elt_t  **buckets;
25    ngx_uint_t        size;
26} ngx_hash_t;
27
28
29typedef struct {
30    ngx_hash_t        hash;
31    void             *value;
32} ngx_hash_wildcard_t;
33
34
35typedef struct {
36    ngx_str_t         key;
37    ngx_uint_t        key_hash;
38    void             *value;
39} ngx_hash_key_t;
40
41
42typedef ngx_uint_t (*ngx_hash_key_pt) (u_char *data, size_t len);
43
44
45typedef struct {
46    ngx_hash_t            hash;
47    ngx_hash_wildcard_t  *wc_head;
48    ngx_hash_wildcard_t  *wc_tail;
49} ngx_hash_combined_t;
50
51
52typedef struct {
53    ngx_hash_t       *hash;
54    ngx_hash_key_pt   key;
55
56    ngx_uint_t        max_size;
57    ngx_uint_t        bucket_size;
58
59    char             *name;
60    ngx_pool_t       *pool;
61    ngx_pool_t       *temp_pool;
62} ngx_hash_init_t;
63
64
65#define NGX_HASH_SMALL            1
66#define NGX_HASH_LARGE            2
67
68#define NGX_HASH_LARGE_ASIZE      16384
69#define NGX_HASH_LARGE_HSIZE      10007
70
71#define NGX_HASH_WILDCARD_KEY     1
72#define NGX_HASH_READONLY_KEY     2
73
74
75typedef struct {
76    ngx_uint_t        hsize;
77
78    ngx_pool_t       *pool;
79    ngx_pool_t       *temp_pool;
80
81    ngx_array_t       keys;
82    ngx_array_t      *keys_hash;
83
84    ngx_array_t       dns_wc_head;
85    ngx_array_t      *dns_wc_head_hash;
86
87    ngx_array_t       dns_wc_tail;
88    ngx_array_t      *dns_wc_tail_hash;
89} ngx_hash_keys_arrays_t;
90
91
92typedef struct {
93    ngx_uint_t        hash;
94    ngx_str_t         key;
95    ngx_str_t         value;
96    u_char           *lowcase_key;
97} ngx_table_elt_t;
98
99
100void *ngx_hash_find(ngx_hash_t *hash, ngx_uint_t key, u_char *name, size_t len);
101void *ngx_hash_find_wc_head(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);
102void *ngx_hash_find_wc_tail(ngx_hash_wildcard_t *hwc, u_char *name, size_t len);
103void *ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key,
104    u_char *name, size_t len);
105
106ngx_int_t ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
107    ngx_uint_t nelts);
108ngx_int_t ngx_hash_wildcard_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names,
109    ngx_uint_t nelts);
110
111#define ngx_hash(key, c)   ((ngx_uint_t) key * 31 + c)
112ngx_uint_t ngx_hash_key(u_char *data, size_t len);
113ngx_uint_t ngx_hash_key_lc(u_char *data, size_t len);
114ngx_uint_t ngx_hash_strlow(u_char *dst, u_char *src, size_t n);
115
116
117ngx_int_t ngx_hash_keys_array_init(ngx_hash_keys_arrays_t *ha, ngx_uint_t type);
118ngx_int_t ngx_hash_add_key(ngx_hash_keys_arrays_t *ha, ngx_str_t *key,
119    void *value, ngx_uint_t flags);
120
121
122#endif /* _NGX_HASH_H_INCLUDED_ */
123