aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/core/transport/chttp2/stream_encoder.c4
-rw-r--r--src/core/transport/metadata.c6
-rw-r--r--src/core/transport/metadata.h3
3 files changed, 7 insertions, 6 deletions
diff --git a/src/core/transport/chttp2/stream_encoder.c b/src/core/transport/chttp2/stream_encoder.c
index 07eeb0a474..8595a59879 100644
--- a/src/core/transport/chttp2/stream_encoder.c
+++ b/src/core/transport/chttp2/stream_encoder.c
@@ -175,7 +175,7 @@ static gpr_uint8 *add_tiny_header_data(framer_state *st, int len) {
static void add_elem(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem) {
gpr_uint32 key_hash = elem->key->hash;
- gpr_uint32 elem_hash = key_hash ^ elem->value->hash;
+ gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash);
gpr_uint32 new_index = c->tail_remote_index + c->table_elems + 1;
gpr_uint32 elem_size = 32 + GPR_SLICE_LENGTH(elem->key->slice) +
GPR_SLICE_LENGTH(elem->value->slice);
@@ -354,7 +354,7 @@ static gpr_uint32 dynidx(grpc_chttp2_hpack_compressor *c, gpr_uint32 index) {
static void hpack_enc(grpc_chttp2_hpack_compressor *c, grpc_mdelem *elem,
framer_state *st) {
gpr_uint32 key_hash = elem->key->hash;
- gpr_uint32 elem_hash = key_hash ^ elem->value->hash;
+ gpr_uint32 elem_hash = GRPC_MDSTR_KV_HASH(key_hash, elem->value->hash);
size_t decoder_space_usage;
gpr_uint32 indices_key;
int should_add_elem;
diff --git a/src/core/transport/metadata.c b/src/core/transport/metadata.c
index 1a869cfbc5..e8ab216671 100644
--- a/src/core/transport/metadata.c
+++ b/src/core/transport/metadata.c
@@ -45,8 +45,6 @@
#define INITIAL_STRTAB_CAPACITY 4
#define INITIAL_MDTAB_CAPACITY 4
-#define KV_HASH(key, value) ((key)->hash ^ (value)->hash)
-
typedef struct internal_string {
/* must be byte compatible with grpc_mdstr */
gpr_slice slice;
@@ -375,7 +373,7 @@ static void grow_mdtab(grpc_mdctx *ctx) {
for (i = 0; i < ctx->mdtab_capacity; i++) {
for (md = ctx->mdtab[i]; md; md = next) {
- hash = KV_HASH(md->key, md->value);
+ hash = GRPC_MDSTR_KV_HASH(md->key->hash, md->value->hash);
next = md->bucket_next;
md->bucket_next = mdtab[hash % capacity];
mdtab[hash % capacity] = md;
@@ -400,7 +398,7 @@ grpc_mdelem *grpc_mdelem_from_metadata_strings(grpc_mdctx *ctx,
grpc_mdstr *mvalue) {
internal_string *key = (internal_string *)mkey;
internal_string *value = (internal_string *)mvalue;
- gpr_uint32 hash = KV_HASH(mkey, mvalue);
+ gpr_uint32 hash = GRPC_MDSTR_KV_HASH(mkey->hash, mvalue->hash);
internal_metadata *md;
GPR_ASSERT(key->context == ctx);
diff --git a/src/core/transport/metadata.h b/src/core/transport/metadata.h
index 9fca3d4bd5..6c6dee5efd 100644
--- a/src/core/transport/metadata.h
+++ b/src/core/transport/metadata.h
@@ -35,6 +35,7 @@
#define __GRPC_INTERNAL_TRANSPORT_METADATA_H__
#include <grpc/support/slice.h>
+#include <grpc/support/useful.h>
/* This file provides a mechanism for tracking metadata through the grpc stack.
It's not intended for consumption outside of the library.
@@ -133,4 +134,6 @@ void grpc_mdelem_unref(grpc_mdelem *md);
Does not promise that the returned string has no embedded nulls however. */
const char *grpc_mdstr_as_c_string(grpc_mdstr *s);
+#define GRPC_MDSTR_KV_HASH(k_hash, v_hash) (GPR_ROTL((k_hash), 2) ^ (v_hash))
+
#endif /* __GRPC_INTERNAL_TRANSPORT_METADATA_H__ */