Hi,

On 2026-02-19 14:01:15 -0500, Andres Freund wrote:
> The hash functions of some types are ... peculiar (partially due to
> cross-type hashjoin support).

In case you want a reference for said peculiarity, look at this:

=# SELECT lower, upper, lower | upper as V, hashint8(lower | upper) FROM 
(SELECT (i) as lower, ((i)::int8 << 32) as upper FROM generate_series(0, 5) 
g(i));
┌───────┬─────────────┬─────────────┬────────────┐
│ lower │    upper    │      v      │  hashint8  │
├───────┼─────────────┼─────────────┼────────────┤
│     0 │           0 │           0 │ -272711505 │
│     1 │  4294967296 │  4294967297 │ -272711505 │
│     2 │  8589934592 │  8589934594 │ -272711505 │
│     3 │ 12884901888 │ 12884901891 │ -272711505 │
│     4 │ 17179869184 │ 17179869188 │ -272711505 │
│     5 │ 21474836480 │ 21474836485 │ -272711505 │
└───────┴─────────────┴─────────────┴────────────┘
(6 rows)

Which obviously could have some ... fun consequences.


Whoever chose to implement the cross type compatibility by
a) using int4 as the hash "domain", instead of always hashing 8 bytes
b) implementing int8 by doubling up the high 32bits into the lower 32 bits,
   instead of hashint4 iff the value value fits into 32bits and the full 8
   bytes otherwise

did us really no service.

Greetings,

Andres Freund


Reply via email to