From 3312663274d2278a58fa3e24d8c157ff8d47b620 Mon Sep 17 00:00:00 2001 From: Aleksander Alekseev Date: Tue, 13 Jan 2026 14:51:21 +0300 Subject: [PATCH v6 1/2] Simplify abbreviated key hashing using murmurhash64() Now when all Datums are 64-bit values we can simplify the code by using murmurhash64() in *_abbrev_convert() functions. Also replace hash_uint32() with murmurhash32() in a few other places for consistency. Author: Aleksander Alekseev Suggested-by: John Naylor Reviewed-by: John Naylor Discussion: https://postgr.es/m/CAJ7c6TMPhDRQMmkUHPv8oOK97B1mR8NRS61DgjpdaZUPAwaeZQ%40mail.gmail.com --- src/backend/utils/adt/bytea.c | 9 ++------- src/backend/utils/adt/network.c | 8 +------- src/backend/utils/adt/numeric.c | 7 +------ src/backend/utils/adt/uuid.c | 8 +------- src/backend/utils/adt/varlena.c | 9 ++------- 5 files changed, 7 insertions(+), 34 deletions(-) diff --git a/src/backend/utils/adt/bytea.c b/src/backend/utils/adt/bytea.c index a1f5d4e572b..71dc591438d 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 f4bf9c3b532..cc2bd3c7344 100644 --- a/src/backend/utils/adt/network.c +++ b/src/backend/utils/adt/network.c @@ -738,13 +738,7 @@ 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 c9717faea26..3712cd0e9df 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -2404,12 +2404,7 @@ 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(result)); return NumericAbbrevGetDatum(result); } diff --git a/src/backend/utils/adt/uuid.c b/src/backend/utils/adt/uuid.c index 2d33ba2640b..7b55528cbb7 100644 --- a/src/backend/utils/adt/uuid.c +++ b/src/backend/utils/adt/uuid.c @@ -413,13 +413,7 @@ 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 0c6d3ba4d22..18ef69f7e0c 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); -- 2.43.0