public inbox for [email protected]help / color / mirror / Atom feed
[PATCH v7 3/3] Optimize hash function 2+ messages / 2 participants [nested] [flat]
* [PATCH v7 3/3] Optimize hash function @ 2021-01-20 22:06 Heikki Linnakangas <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Heikki Linnakangas @ 2021-01-20 22:06 UTC (permalink / raw) --- src/backend/utils/resowner/resowner.c | 24 ++++++++++++++++++------ src/include/common/hashfn.h | 15 +++++++++++++++ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index d62b1495dd3..6189d051072 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -163,15 +163,27 @@ static void ReleaseAuxProcessResourcesCallback(int code, Datum arg); * INTERNAL ROUTINES * *****************************************************************************/ +/* + * Hash function for value+kind combination. + */ static inline uint32 hash_resource_elem(Datum value, ResourceOwnerFuncs *kind) { - Datum data[2]; - - data[0] = value; - data[1] = PointerGetDatum(kind); - - return hash_bytes((unsigned char *) &data, 2 * SIZEOF_DATUM); + /* + * Most resources types store a pointer in 'value', and pointers are + * unique all on their own. But some resources store plain integers (Files + * and Buffers as of this writing), so we want to incorporate the 'kind' + * in the hash too, otherwise those resources will collide a lot. But + * because there are only a few resource kinds like that - and only a few + * resource kinds to begin with - we don't need to work too hard to mix + * 'kind' into the hash. Just add it with hash_combine(), it perturbs the + * result enough for our purposes. + */ +#if SIZEOF_DATUM == 8 + return hash_combine64(murmurhash64((uint64) value), (uint64) kind); +#else + return hash_combine(murmurhash32((uint32) value), (uint32) kind); +#endif } static void diff --git a/src/include/common/hashfn.h b/src/include/common/hashfn.h index c634cc067a1..009ffbbdd38 100644 --- a/src/include/common/hashfn.h +++ b/src/include/common/hashfn.h @@ -101,4 +101,19 @@ murmurhash32(uint32 data) return h; } +/* 64-bit variant */ +static inline uint64 +murmurhash64(uint64 data) +{ + uint64 h = data; + + h ^= h >> 33; + h *= 0xff51afd7ed558ccd; + h ^= h >> 33; + h *= 0xc4ceb9fe1a85ec53; + h ^= h >> 33; + + return h; +} + #endif /* HASHFN_H */ -- 2.30.1 --------------C6A03312D0F99F9183A0DF46-- ^ permalink raw reply [nested|flat] 2+ messages in thread
* Re: [EXTERNAL] Re: [PATCH] Support using "all" for the db user in pg_ident.conf @ 2023-01-11 09:04 Jelte Fennema <[email protected]> 0 siblings, 0 replies; 2+ messages in thread From: Jelte Fennema @ 2023-01-11 09:04 UTC (permalink / raw) To: Michael Paquier <[email protected]>; +Cc: [email protected] <[email protected]>; [email protected] <[email protected]> > The confusion that 0001 is addressing is fair (cough, fc579e1, cough), > still I am wondering whether we could do a bit better to be more Yeah, even after 0001 it's definitely suboptimal. I tried to keep the changes minimal to not distract from the main purpose of this patch. But I'll update the patch to have some more. I'll respond to your other question first > In what is your proposal different from the following > entry in pg_ident.conf? As of: > mapname /^(.*)$ \1 It's very different. I think easiest is to explain by example: If there exist three users on the postgres server: admin, jelte and michael Then this rule (your suggested rule): mapname /^(.*)$ \1 Is equivalent to: mapname admin admin mapname jelte jelte mapname michael michael While with the "all" keyword you can create a rule like this: mapname admin all which is equivalent to: mapname admin admin mapname admin jelte mapname admin michael ^ permalink raw reply [nested|flat] 2+ messages in thread
end of thread, other threads:[~2023-01-11 09:04 UTC | newest] Thread overview: 2+ messages (download: mbox mbox.gz follow: Atom feed) -- links below jump to the message on this page -- 2021-01-20 22:06 [PATCH v7 3/3] Optimize hash function Heikki Linnakangas <[email protected]> 2023-01-11 09:04 Re: [EXTERNAL] Re: [PATCH] Support using "all" for the db user in pg_ident.conf Jelte Fennema <[email protected]>
This inbox is served by agora; see mirroring instructions for how to clone and mirror all data and code used for this inbox