Re: Change GUC hashtable to use simplehash?
John Naylor <johncnaylorls@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Silence warning in older versions of Valgrind
- fde7c0164ea2 17.5 landed
- 0600d276d485 18.0 landed
-
Revert "Speed up tail processing when hashing aligned C strings, take two"
- 6555fe197914 17.3 landed
- 235328ee4ae4 18.0 landed
-
Speed up tail processing when hashing aligned C strings, take two
- a365d9e2e8c1 17.0 landed
-
Teach fasthash_accum to use platform endianness for bytewise loads
- 0c25fee35903 17.0 landed
-
Add macro to disable address safety instrumentation
- db17594ad73a 17.0 landed
-
Convert uses of hash_string_pointer to fasthash equivalent
- f956ecd0353b 17.0 landed
-
Speed up tail processing when hashing aligned C strings
- 07f0f6abfc7f 17.0 landed
-
Add helper functions for dshash tables with string keys.
- 42a1de3013ea 17.0 cited
-
Fix warnings in cpluspluscheck
- 257998508672 17.0 landed
-
Further cosmetic review of hashfn_unstable.h
- b83033c3cff5 17.0 landed
-
Simplify initialization of incremental hash state
- 9ed3ee5001b6 17.0 landed
-
Add optimized C string hashing
- 0aba2554409e 17.0 landed
-
Add inline incremental hash functions for in-memory use
- e97b672c88f6 17.0 landed
-
Make all Perl warnings fatal
- c5385929593d 17.0 cited
On Fri, Jan 19, 2024 at 11:54 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote: > Thanks! I started to look at how to use this, and I have some questions. > I'd like to replace this murmurhash ussage in resowner.c with this: > > > /* > > * Most resource kinds 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 > > The straightforward replacement would be: > > fasthash_state hs; > > fasthash_init(&hs, sizeof(Datum), 0); > fasthash_accum(&hs, (char *) &kind, sizeof(ResourceOwnerDesc *)); > fasthash_accum(&hs, (char *) &value, sizeof(Datum)); > return fasthash_final32(&hs, 0); That would give the fullest mixing possible, more than currently. > But I wonder if it would be OK to abuse the 'seed' and 'tweak' > parameters to the init and final functions instead, like this: > > fasthash_state hs; > > fasthash_init(&hs, sizeof(Datum), (uint64) kind); > return fasthash_final32(&hs, (uint64) value); This would go in the other direction, and sacrifice some quality for speed. The fasthash finalizer is pretty short -- XMX, where X is "right shift and XOR" and M is "multiply". In looking at some other hash functions, it seems that's often done only if the input has already had some mixing. The Murmur finalizer has the shape XMXMX, and that seems to be the preferred way to get good mixing on a single register-sized value. For that reason, hash functions whose main loop is designed for long inputs will often skip that for small inputs and just go straight to a Murmur-style finalizer. Fasthash doesn't do that, so for a small input it ends up doing XMXM then XMX, which is a little more expensive. > I couldn't find any guidance on what properties the 'seed' and 'tweak' > have, compared to just accumulating the values with accum. Anyone know? In Postgres, I only know of one use of a seed parameter, to create two independent hash functions from hash_bytes_uint32_extended(), in brin-bloom indexes. I think that's the more typical use for a seed. Since there was no guidance with the existing hash functions, and it's a widespread concept, I didn't feel the need to put any here. We could change that. I modeled the finalizer tweak on one of the finalizers in xxHash that also used it only for the input length. Length is used as a tiebreaker where otherwise it will often not collide anyway, so it seems that's how we should think about using it elsewhere. There is a comment above fasthash_final64 mentioning that the tweak is used for length when that is not known ahead of time, but it might be good to generalize that, and maybe put it somewhere more prominent. With that in mind, I'm not sure "value" is a good fit for the tweak. "kind" is sort of in the middle because IIUC it doesn't mattter at all for pointer values, but it's important for other kinds, which would commonly collide. If I were to change from murmur64, I'd probably go in between the two extremes mentioned earlier, and mix "value" normally and pass "kind" as the seed: fasthash_state hs; fasthash_init(&hs, sizeof(Datum), kind); fasthash_accum(&hs, (char *) &value, sizeof(Datum)); return fasthash_final32(&hs, 0);