mirror of
https://github.com/nginx/nginx.git
synced 2024-12-05 06:19:01 +08:00
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
This commit is contained in:
parent
980220ffaf
commit
6884183ad9
@ -245,7 +245,7 @@ ngx_hash_find_combined(ngx_hash_combined_t *hash, ngx_uint_t key, u_char *name,
|
|||||||
|
|
||||||
|
|
||||||
#define NGX_HASH_ELT_SIZE(name) \
|
#define NGX_HASH_ELT_SIZE(name) \
|
||||||
(sizeof(void *) + ngx_align((name)->key.len + 1, sizeof(void *)))
|
(sizeof(void *) + ngx_align((name)->key.len + 2, sizeof(void *)))
|
||||||
|
|
||||||
ngx_int_t
|
ngx_int_t
|
||||||
ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)
|
ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)
|
||||||
@ -257,14 +257,6 @@ ngx_hash_init(ngx_hash_init_t *hinit, ngx_hash_key_t *names, ngx_uint_t nelts)
|
|||||||
ngx_hash_elt_t *elt, **buckets;
|
ngx_hash_elt_t *elt, **buckets;
|
||||||
|
|
||||||
for (n = 0; n < nelts; n++) {
|
for (n = 0; n < nelts; n++) {
|
||||||
if (names[n].key.len >= 255) {
|
|
||||||
ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,
|
|
||||||
"the \"%V\" value to hash is to long: %uz bytes, "
|
|
||||||
"the maximum length can be 255 bytes only",
|
|
||||||
&names[n].key, names[n].key.len);
|
|
||||||
return NGX_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *))
|
if (hinit->bucket_size < NGX_HASH_ELT_SIZE(&names[n]) + sizeof(void *))
|
||||||
{
|
{
|
||||||
ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,
|
ngx_log_error(NGX_LOG_EMERG, hinit->pool->log, 0,
|
||||||
@ -406,7 +398,7 @@ found:
|
|||||||
elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]);
|
elt = (ngx_hash_elt_t *) ((u_char *) buckets[key] + test[key]);
|
||||||
|
|
||||||
elt->value = names[n].value;
|
elt->value = names[n].value;
|
||||||
elt->len = (u_char) names[n].key.len;
|
elt->len = (u_short) names[n].key.len;
|
||||||
|
|
||||||
ngx_strlow(elt->name, names[n].key.data, names[n].key.len);
|
ngx_strlow(elt->name, names[n].key.data, names[n].key.len);
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *value;
|
void *value;
|
||||||
u_char len;
|
u_short len;
|
||||||
u_char name[1];
|
u_char name[1];
|
||||||
} ngx_hash_elt_t;
|
} ngx_hash_elt_t;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user