From: Robert Haas Date: Sun, 29 Oct 2017 07:11:43 +0000 (+0530) Subject: Add hash_combine64. X-Git-Tag: REL_11_BETA1~1325 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b7f3eb31405f1dbbf086e5a8f88569a6dc85157a;p=thirdparty%2Fpostgresql.git Add hash_combine64. Extracted from a larger patch by Amul Sul, with some comment additions by me. Discussion: http://postgr.es/m/20171024113004.hn5qajypin4dy5sw@alap3.anarazel.de --- diff --git a/src/include/utils/hashutils.h b/src/include/utils/hashutils.h index 366bd0e78bd..3a5c21f5235 100644 --- a/src/include/utils/hashutils.h +++ b/src/include/utils/hashutils.h @@ -8,8 +8,8 @@ #define HASHUTILS_H /* - * Combine two hash values, resulting in another hash value, with decent bit - * mixing. + * Combine two 32-bit hash values, resulting in another hash value, with + * decent bit mixing. * * Similar to boost's hash_combine(). */ @@ -20,6 +20,18 @@ hash_combine(uint32 a, uint32 b) return a; } +/* + * Combine two 64-bit hash values, resulting in another hash value, using the + * same kind of technique as hash_combine(). Testing shows that this also + * produces good bit mixing. + */ +static inline uint64 +hash_combine64(uint64 a, uint64 b) +{ + /* 0x49a0f4dd15e5a8e3 is 64bit random data */ + a ^= b + 0x49a0f4dd15e5a8e3 + (a << 54) + (a >> 7); + return a; +} /* * Simple inline murmur hash implementation hashing a 32 bit integer, for