allow hash key values more than 255 bytes, it does not actually increase mean
hash element size, because due to aligning a byte after key is not used
anyway in 3/4 cases on 32-bit platforms and in 7/8 cases on 64-bit platforms
Igor Sysoev
12 years ago
244 | 244 | |
245 | 245 | |
246 | 246 | #define NGX_HASH_ELT_SIZE(name) \ |
247 | (sizeof(void *) + ngx_align((name)->key.len + 1, sizeof(void *))) | |
247 | (sizeof(void *) + ngx_align((name)->key.len + 2, sizeof(void *))) | |
248 | 248 | |
249 | 249 | ngx_int_t |
250 | 250 | ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts) |
256 | 256 | ngx_hash_elt_t *elt, **buckets; |
257 | 257 | |
258 | 258 | for (n = 0; n < nelts; n++) { |
259 | if (names[n].key.len >= 255) { | |
260 | ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, | |
261 | "the \"%V\" value to hash is to long: %uz bytes, " | |
262 | "the maximum length can be 255 bytes only", | |
263 | &names[n].key, names[n].key.len); | |
264 | return NGX_ERROR; | |
265 | } | |
266 | ||
267 | 259 | if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *)) |
268 | 260 | { |
269 | 261 | ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0, |
405 | 397 | elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]); |
406 | 398 | |
407 | 399 | elt->value = names[n].value; |
408 | elt->len = (u_char) names[n].key.len; | |
400 | elt->len = (u_short) names[n].key.len; | |
409 | 401 | |
410 | 402 | ngx_strlow(elt->name, names[n].key.data, names[n].key.len); |
411 | 403 |