From d39fda1cc404834781458376173e5293f870e83a Mon Sep 17 00:00:00 2001 From: John Naylor Date: Mon, 21 Sep 2026 17:36:50 +0700 Subject: [PATCH] Simplify abbreviated key hashing during cardinality estimation In the wake of commit 2a600a93c, Datums are 64-bit values, so we no longer need to fold the abbreviated key to 32 bits before hashing. Instead, use murmurhash64(), which is simpler and avoids a function call. Also replace hash_uint32() with murmurhash32() in related places. Author: Aleksander Alekseev Suggested-by: John Naylor Reviewed-by: Aditya Gollamudi (earlier version) Reviewed-by: Michael Paquier (earlier version) Discussion: https://postgr.es/m/CAJ7c6TMPhDRQMmkUHPv8oOK97B1mR8NRS61DgjpdaZUPAwaeZQ%40mail.gmail.com --- src/backend/utils/adt/bytea.c | 9 ++------- src/backend/utils/adt/network.c | 9 ++------- src/backend/utils/adt/numeric.c | 8 ++------ src/backend/utils/adt/uuid.c | 9 ++------- src/backend/utils/adt/varlena.c | 9 ++------- 5 files changed, 10 insertions(+), 34 deletions(-) diff --git a/src/backend/utils/adt/bytea.c b/src/backend/utils/adt/bytea.c index f83bbfb9ca0..da32f9c53c6 100644 --- a/src/backend/utils/adt/bytea.c +++ b/src/backend/utils/adt/bytea.c @@ -1110,17 +1110,12 @@ bytea_abbrev_convert(Datum original, SortSupport ssup) Min(len, PG_CACHE_LINE_SIZE))); if (len > PG_CACHE_LINE_SIZE) - hash ^= DatumGetUInt32(hash_uint32((uint32) len)); + hash ^= murmurhash32((uint32) len); addHyperLogLog(&bss->full_card, hash); /* Hash abbreviated key */ - { - uint32 tmp; - - tmp = DatumGetUInt32(res) ^ (uint32) (DatumGetUInt64(res) >> 32); - hash = DatumGetUInt32(hash_uint32(tmp)); - } + hash = (uint32) murmurhash64(DatumGetUInt64(res)); addHyperLogLog(&bss->abbr_card, hash); diff --git a/src/backend/utils/adt/network.c b/src/backend/utils/adt/network.c index 1702f717e71..52a3540cf9e 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -738,13 +738,8 @@ network_abbrev_convert(Datum original, SortSupport ssup) /* Hash abbreviated key */ if (uss->estimating) - { - uint32 tmp; - - tmp = DatumGetUInt32(res) ^ (uint32) (DatumGetUInt64(res) >> 32); - - addHyperLogLog(&uss->abbr_card, DatumGetUInt32(hash_uint32(tmp))); - } + addHyperLogLog(&uss->abbr_card, + (uint32) murmurhash64(DatumGetUInt64(res))); return res; } diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 37f24e33857..238f2e89f1d 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -2404,12 +2404,8 @@ numeric_abbrev_convert_var(const NumericVar *var, NumericSortSupport *nss) result = -result; if (nss->estimating) - { - uint32 tmp = ((uint32) result - ^ (uint32) ((uint64) result >> 32)); - - addHyperLogLog(&nss->abbr_card, DatumGetUInt32(hash_uint32(tmp))); - } + addHyperLogLog(&nss->abbr_card, + (uint32) murmurhash64((uint64) result)); return NumericAbbrevGetDatum(result); } diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c index c019e17f21b..49e59e7c75a 100644 --- a/src/backend/utils/adt/uuid.c +++ b/src/backend/utils/adt/uuid.c @@ -521,13 +521,8 @@ uuid_abbrev_convert(Datum original, SortSupport ssup) uss->input_count += 1; if (uss->estimating) - { - uint32 tmp; - - tmp = DatumGetUInt32(res) ^ (uint32) (DatumGetUInt64(res) >> 32); - - addHyperLogLog(&uss->abbr_card, DatumGetUInt32(hash_uint32(tmp))); - } + addHyperLogLog(&uss->abbr_card, + (uint32) murmurhash64(DatumGetUInt64(res))); /* * Byteswap on little-endian machines. diff --git a/src/backend/utils/adt/varlena.c b/src/backend/utils/adt/varlena.c index 01cc61c5778..910fc24313b 100644 --- a/src/backend/utils/adt/varlena.c +++ b/src/backend/utils/adt/varlena.c @@ -2158,17 +2158,12 @@ varstr_abbrev_convert(Datum original, SortSupport ssup) Min(len, PG_CACHE_LINE_SIZE))); if (len > PG_CACHE_LINE_SIZE) - hash ^= DatumGetUInt32(hash_uint32((uint32) len)); + hash ^= murmurhash32((uint32) len); addHyperLogLog(&sss->full_card, hash); /* Hash abbreviated key */ - { - uint32 tmp; - - tmp = DatumGetUInt32(res) ^ (uint32) (DatumGetUInt64(res) >> 32); - hash = DatumGetUInt32(hash_uint32(tmp)); - } + hash = (uint32) murmurhash64(DatumGetUInt64(res)); addHyperLogLog(&sss->abbr_card, hash);