LCOV - code coverage report
Current view: top level - src/common - hashfn.c (source / functions) Coverage Total Hit
Test: PostgreSQL 19devel Lines: 98.8 % 168 166
Test Date: 2026-03-12 06:14:44 Functions: 100.0 % 7 7
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /*-------------------------------------------------------------------------
       2              :  *
       3              :  * hashfn.c
       4              :  *      Generic hashing functions, and hash functions for use in dynahash.c
       5              :  *      hashtables
       6              :  *
       7              :  *
       8              :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       9              :  * Portions Copyright (c) 1994, Regents of the University of California
      10              :  *
      11              :  *
      12              :  * IDENTIFICATION
      13              :  *    src/common/hashfn.c
      14              :  *
      15              :  * NOTES
      16              :  *    It is expected that every bit of a hash function's 32-bit result is
      17              :  *    as random as every other; failure to ensure this is likely to lead
      18              :  *    to poor performance of hash tables.  In most cases a hash
      19              :  *    function should use hash_bytes() or its variant hash_bytes_uint32(),
      20              :  *    or the wrappers hash_any() and hash_uint32 defined in hashfn.h.
      21              :  *
      22              :  *-------------------------------------------------------------------------
      23              :  */
      24              : #include "postgres.h"
      25              : 
      26              : #include "common/hashfn.h"
      27              : #include "port/pg_bitutils.h"
      28              : 
      29              : 
      30              : /*
      31              :  * This hash function was written by Bob Jenkins
      32              :  * (bob_jenkins@burtleburtle.net), and superficially adapted
      33              :  * for PostgreSQL by Neil Conway. For more information on this
      34              :  * hash function, see http://burtleburtle.net/bob/hash/doobs.html,
      35              :  * or Bob's article in Dr. Dobb's Journal, Sept. 1997.
      36              :  *
      37              :  * In the current code, we have adopted Bob's 2006 update of his hash
      38              :  * function to fetch the data a word at a time when it is suitably aligned.
      39              :  * This makes for a useful speedup, at the cost of having to maintain
      40              :  * four code paths (aligned vs unaligned, and little-endian vs big-endian).
      41              :  * It also uses two separate mixing functions mix() and final(), instead
      42              :  * of a slower multi-purpose function.
      43              :  */
      44              : 
      45              : /* Get a bit mask of the bits set in non-uint32 aligned addresses */
      46              : #define UINT32_ALIGN_MASK (sizeof(uint32) - 1)
      47              : 
      48              : #define rot(x,k) pg_rotate_left32(x, k)
      49              : 
      50              : /*----------
      51              :  * mix -- mix 3 32-bit values reversibly.
      52              :  *
      53              :  * This is reversible, so any information in (a,b,c) before mix() is
      54              :  * still in (a,b,c) after mix().
      55              :  *
      56              :  * If four pairs of (a,b,c) inputs are run through mix(), or through
      57              :  * mix() in reverse, there are at least 32 bits of the output that
      58              :  * are sometimes the same for one pair and different for another pair.
      59              :  * This was tested for:
      60              :  * * pairs that differed by one bit, by two bits, in any combination
      61              :  *   of top bits of (a,b,c), or in any combination of bottom bits of
      62              :  *   (a,b,c).
      63              :  * * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
      64              :  *   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
      65              :  *   is commonly produced by subtraction) look like a single 1-bit
      66              :  *   difference.
      67              :  * * the base values were pseudorandom, all zero but one bit set, or
      68              :  *   all zero plus a counter that starts at zero.
      69              :  *
      70              :  * This does not achieve avalanche.  There are input bits of (a,b,c)
      71              :  * that fail to affect some output bits of (a,b,c), especially of a.  The
      72              :  * most thoroughly mixed value is c, but it doesn't really even achieve
      73              :  * avalanche in c.
      74              :  *
      75              :  * This allows some parallelism.  Read-after-writes are good at doubling
      76              :  * the number of bits affected, so the goal of mixing pulls in the opposite
      77              :  * direction from the goal of parallelism.  I did what I could.  Rotates
      78              :  * seem to cost as much as shifts on every machine I could lay my hands on,
      79              :  * and rotates are much kinder to the top and bottom bits, so I used rotates.
      80              :  *----------
      81              :  */
      82              : #define mix(a,b,c) \
      83              : { \
      84              :   a -= c;  a ^= rot(c, 4);  c += b; \
      85              :   b -= a;  b ^= rot(a, 6);  a += c; \
      86              :   c -= b;  c ^= rot(b, 8);  b += a; \
      87              :   a -= c;  a ^= rot(c,16);  c += b; \
      88              :   b -= a;  b ^= rot(a,19);  a += c; \
      89              :   c -= b;  c ^= rot(b, 4);  b += a; \
      90              : }
      91              : 
      92              : /*----------
      93              :  * final -- final mixing of 3 32-bit values (a,b,c) into c
      94              :  *
      95              :  * Pairs of (a,b,c) values differing in only a few bits will usually
      96              :  * produce values of c that look totally different.  This was tested for
      97              :  * * pairs that differed by one bit, by two bits, in any combination
      98              :  *   of top bits of (a,b,c), or in any combination of bottom bits of
      99              :  *   (a,b,c).
     100              :  * * "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
     101              :  *   the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
     102              :  *   is commonly produced by subtraction) look like a single 1-bit
     103              :  *   difference.
     104              :  * * the base values were pseudorandom, all zero but one bit set, or
     105              :  *   all zero plus a counter that starts at zero.
     106              :  *
     107              :  * The use of separate functions for mix() and final() allow for a
     108              :  * substantial performance increase since final() does not need to
     109              :  * do well in reverse, but is does need to affect all output bits.
     110              :  * mix(), on the other hand, does not need to affect all output
     111              :  * bits (affecting 32 bits is enough).  The original hash function had
     112              :  * a single mixing operation that had to satisfy both sets of requirements
     113              :  * and was slower as a result.
     114              :  *----------
     115              :  */
     116              : #define final(a,b,c) \
     117              : { \
     118              :   c ^= b; c -= rot(b,14); \
     119              :   a ^= c; a -= rot(c,11); \
     120              :   b ^= a; b -= rot(a,25); \
     121              :   c ^= b; c -= rot(b,16); \
     122              :   a ^= c; a -= rot(c, 4); \
     123              :   b ^= a; b -= rot(a,14); \
     124              :   c ^= b; c -= rot(b,24); \
     125              : }
     126              : 
     127              : /*
     128              :  * hash_bytes() -- hash a variable-length key into a 32-bit value
     129              :  *      k       : the key (the unaligned variable-length array of bytes)
     130              :  *      len     : the length of the key, counting by bytes
     131              :  *
     132              :  * Returns a uint32 value.  Every bit of the key affects every bit of
     133              :  * the return value.  Every 1-bit and 2-bit delta achieves avalanche.
     134              :  * About 6*len+35 instructions. The best hash table sizes are powers
     135              :  * of 2.  There is no need to do mod a prime (mod is sooo slow!).
     136              :  * If you need less than 32 bits, use a bitmask.
     137              :  *
     138              :  * This procedure must never throw elog(ERROR); the ResourceOwner code
     139              :  * relies on this not to fail.
     140              :  *
     141              :  * Note: we could easily change this function to return a 64-bit hash value
     142              :  * by using the final values of both b and c.  b is perhaps a little less
     143              :  * well mixed than c, however.
     144              :  */
     145              : uint32
     146    185263899 : hash_bytes(const unsigned char *k, int keylen)
     147              : {
     148              :     uint32      a,
     149              :                 b,
     150              :                 c,
     151              :                 len;
     152              : 
     153              :     /* Set up the internal state */
     154    185263899 :     len = keylen;
     155    185263899 :     a = b = c = 0x9e3779b9 + len + 3923095;
     156              : 
     157              :     /* If the source pointer is word-aligned, we use word-wide fetches */
     158    185263899 :     if (((uintptr_t) k & UINT32_ALIGN_MASK) == 0)
     159              :     {
     160              :         /* Code path for aligned source data */
     161    183105259 :         const uint32 *ka = (const uint32 *) k;
     162              : 
     163              :         /* handle most of the key */
     164    360705490 :         while (len >= 12)
     165              :         {
     166    177600231 :             a += ka[0];
     167    177600231 :             b += ka[1];
     168    177600231 :             c += ka[2];
     169    177600231 :             mix(a, b, c);
     170    177600231 :             ka += 3;
     171    177600231 :             len -= 12;
     172              :         }
     173              : 
     174              :         /* handle the last 11 bytes */
     175    183105259 :         k = (const unsigned char *) ka;
     176              : #ifdef WORDS_BIGENDIAN
     177              :         switch (len)
     178              :         {
     179              :             case 11:
     180              :                 c += ((uint32) k[10] << 8);
     181              :                 pg_fallthrough;
     182              :             case 10:
     183              :                 c += ((uint32) k[9] << 16);
     184              :                 pg_fallthrough;
     185              :             case 9:
     186              :                 c += ((uint32) k[8] << 24);
     187              :                 pg_fallthrough;
     188              :             case 8:
     189              :                 /* the lowest byte of c is reserved for the length */
     190              :                 b += ka[1];
     191              :                 a += ka[0];
     192              :                 break;
     193              :             case 7:
     194              :                 b += ((uint32) k[6] << 8);
     195              :                 pg_fallthrough;
     196              :             case 6:
     197              :                 b += ((uint32) k[5] << 16);
     198              :                 pg_fallthrough;
     199              :             case 5:
     200              :                 b += ((uint32) k[4] << 24);
     201              :                 pg_fallthrough;
     202              :             case 4:
     203              :                 a += ka[0];
     204              :                 break;
     205              :             case 3:
     206              :                 a += ((uint32) k[2] << 8);
     207              :                 pg_fallthrough;
     208              :             case 2:
     209              :                 a += ((uint32) k[1] << 16);
     210              :                 pg_fallthrough;
     211              :             case 1:
     212              :                 a += ((uint32) k[0] << 24);
     213              :                 /* case 0: nothing left to add */
     214              :         }
     215              : #else                           /* !WORDS_BIGENDIAN */
     216    183105259 :         switch (len)
     217              :         {
     218       314844 :             case 11:
     219       314844 :                 c += ((uint32) k[10] << 24);
     220              :                 pg_fallthrough;
     221       934593 :             case 10:
     222       934593 :                 c += ((uint32) k[9] << 16);
     223              :                 pg_fallthrough;
     224      1229973 :             case 9:
     225      1229973 :                 c += ((uint32) k[8] << 8);
     226              :                 pg_fallthrough;
     227    139958618 :             case 8:
     228              :                 /* the lowest byte of c is reserved for the length */
     229    139958618 :                 b += ka[1];
     230    139958618 :                 a += ka[0];
     231    139958618 :                 break;
     232       346150 :             case 7:
     233       346150 :                 b += ((uint32) k[6] << 16);
     234              :                 pg_fallthrough;
     235       840727 :             case 6:
     236       840727 :                 b += ((uint32) k[5] << 8);
     237              :                 pg_fallthrough;
     238      1116811 :             case 5:
     239      1116811 :                 b += k[4];
     240              :                 pg_fallthrough;
     241     38607945 :             case 4:
     242     38607945 :                 a += ka[0];
     243     38607945 :                 break;
     244       398711 :             case 3:
     245       398711 :                 a += ((uint32) k[2] << 16);
     246              :                 pg_fallthrough;
     247       931680 :             case 2:
     248       931680 :                 a += ((uint32) k[1] << 8);
     249              :                 pg_fallthrough;
     250      1630216 :             case 1:
     251      1630216 :                 a += k[0];
     252              :                 /* case 0: nothing left to add */
     253              :         }
     254              : #endif                          /* WORDS_BIGENDIAN */
     255              :     }
     256              :     else
     257              :     {
     258              :         /* Code path for non-aligned source data */
     259              : 
     260              :         /* handle most of the key */
     261      2534959 :         while (len >= 12)
     262              :         {
     263              : #ifdef WORDS_BIGENDIAN
     264              :             a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24));
     265              :             b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24));
     266              :             c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24));
     267              : #else                           /* !WORDS_BIGENDIAN */
     268       376319 :             a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24));
     269       376319 :             b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24));
     270       376319 :             c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24));
     271              : #endif                          /* WORDS_BIGENDIAN */
     272       376319 :             mix(a, b, c);
     273       376319 :             k += 12;
     274       376319 :             len -= 12;
     275              :         }
     276              : 
     277              :         /* handle the last 11 bytes */
     278              : #ifdef WORDS_BIGENDIAN
     279              :         switch (len)
     280              :         {
     281              :             case 11:
     282              :                 c += ((uint32) k[10] << 8);
     283              :                 pg_fallthrough;
     284              :             case 10:
     285              :                 c += ((uint32) k[9] << 16);
     286              :                 pg_fallthrough;
     287              :             case 9:
     288              :                 c += ((uint32) k[8] << 24);
     289              :                 pg_fallthrough;
     290              :             case 8:
     291              :                 /* the lowest byte of c is reserved for the length */
     292              :                 b += k[7];
     293              :                 pg_fallthrough;
     294              :             case 7:
     295              :                 b += ((uint32) k[6] << 8);
     296              :                 pg_fallthrough;
     297              :             case 6:
     298              :                 b += ((uint32) k[5] << 16);
     299              :                 pg_fallthrough;
     300              :             case 5:
     301              :                 b += ((uint32) k[4] << 24);
     302              :                 pg_fallthrough;
     303              :             case 4:
     304              :                 a += k[3];
     305              :                 pg_fallthrough;
     306              :             case 3:
     307              :                 a += ((uint32) k[2] << 8);
     308              :                 pg_fallthrough;
     309              :             case 2:
     310              :                 a += ((uint32) k[1] << 16);
     311              :                 pg_fallthrough;
     312              :             case 1:
     313              :                 a += ((uint32) k[0] << 24);
     314              :                 /* case 0: nothing left to add */
     315              :         }
     316              : #else                           /* !WORDS_BIGENDIAN */
     317      2158640 :         switch (len)
     318              :         {
     319        26461 :             case 11:
     320        26461 :                 c += ((uint32) k[10] << 24);
     321              :                 pg_fallthrough;
     322       111758 :             case 10:
     323       111758 :                 c += ((uint32) k[9] << 16);
     324              :                 pg_fallthrough;
     325       156318 :             case 9:
     326       156318 :                 c += ((uint32) k[8] << 8);
     327              :                 pg_fallthrough;
     328       192272 :             case 8:
     329              :                 /* the lowest byte of c is reserved for the length */
     330       192272 :                 b += ((uint32) k[7] << 24);
     331              :                 pg_fallthrough;
     332       227402 :             case 7:
     333       227402 :                 b += ((uint32) k[6] << 16);
     334              :                 pg_fallthrough;
     335       327550 :             case 6:
     336       327550 :                 b += ((uint32) k[5] << 8);
     337              :                 pg_fallthrough;
     338       381672 :             case 5:
     339       381672 :                 b += k[4];
     340              :                 pg_fallthrough;
     341       795538 :             case 4:
     342       795538 :                 a += ((uint32) k[3] << 24);
     343              :                 pg_fallthrough;
     344       904488 :             case 3:
     345       904488 :                 a += ((uint32) k[2] << 16);
     346              :                 pg_fallthrough;
     347      1185208 :             case 2:
     348      1185208 :                 a += ((uint32) k[1] << 8);
     349              :                 pg_fallthrough;
     350      1374133 :             case 1:
     351      1374133 :                 a += k[0];
     352              :                 /* case 0: nothing left to add */
     353              :         }
     354              : #endif                          /* WORDS_BIGENDIAN */
     355              :     }
     356              : 
     357    185263899 :     final(a, b, c);
     358              : 
     359              :     /* report the result */
     360    185263899 :     return c;
     361              : }
     362              : 
     363              : /*
     364              :  * hash_bytes_extended() -- hash into a 64-bit value, using an optional seed
     365              :  *      k       : the key (the unaligned variable-length array of bytes)
     366              :  *      len     : the length of the key, counting by bytes
     367              :  *      seed    : a 64-bit seed (0 means no seed)
     368              :  *
     369              :  * Returns a uint64 value.  Otherwise similar to hash_bytes.
     370              :  */
     371              : uint64
     372      2829522 : hash_bytes_extended(const unsigned char *k, int keylen, uint64 seed)
     373              : {
     374              :     uint32      a,
     375              :                 b,
     376              :                 c,
     377              :                 len;
     378              : 
     379              :     /* Set up the internal state */
     380      2829522 :     len = keylen;
     381      2829522 :     a = b = c = 0x9e3779b9 + len + 3923095;
     382              : 
     383              :     /* If the seed is non-zero, use it to perturb the internal state. */
     384      2829522 :     if (seed != 0)
     385              :     {
     386              :         /*
     387              :          * In essence, the seed is treated as part of the data being hashed,
     388              :          * but for simplicity, we pretend that it's padded with four bytes of
     389              :          * zeroes so that the seed constitutes a 12-byte chunk.
     390              :          */
     391      2744153 :         a += (uint32) (seed >> 32);
     392      2744153 :         b += (uint32) seed;
     393      2744153 :         mix(a, b, c);
     394              :     }
     395              : 
     396              :     /* If the source pointer is word-aligned, we use word-wide fetches */
     397      2829522 :     if (((uintptr_t) k & UINT32_ALIGN_MASK) == 0)
     398              :     {
     399              :         /* Code path for aligned source data */
     400      2829414 :         const uint32 *ka = (const uint32 *) k;
     401              : 
     402              :         /* handle most of the key */
     403      6148733 :         while (len >= 12)
     404              :         {
     405      3319319 :             a += ka[0];
     406      3319319 :             b += ka[1];
     407      3319319 :             c += ka[2];
     408      3319319 :             mix(a, b, c);
     409      3319319 :             ka += 3;
     410      3319319 :             len -= 12;
     411              :         }
     412              : 
     413              :         /* handle the last 11 bytes */
     414      2829414 :         k = (const unsigned char *) ka;
     415              : #ifdef WORDS_BIGENDIAN
     416              :         switch (len)
     417              :         {
     418              :             case 11:
     419              :                 c += ((uint32) k[10] << 8);
     420              :                 pg_fallthrough;
     421              :             case 10:
     422              :                 c += ((uint32) k[9] << 16);
     423              :                 pg_fallthrough;
     424              :             case 9:
     425              :                 c += ((uint32) k[8] << 24);
     426              :                 pg_fallthrough;
     427              :             case 8:
     428              :                 /* the lowest byte of c is reserved for the length */
     429              :                 b += ka[1];
     430              :                 a += ka[0];
     431              :                 break;
     432              :             case 7:
     433              :                 b += ((uint32) k[6] << 8);
     434              :                 pg_fallthrough;
     435              :             case 6:
     436              :                 b += ((uint32) k[5] << 16);
     437              :                 pg_fallthrough;
     438              :             case 5:
     439              :                 b += ((uint32) k[4] << 24);
     440              :                 pg_fallthrough;
     441              :             case 4:
     442              :                 a += ka[0];
     443              :                 break;
     444              :             case 3:
     445              :                 a += ((uint32) k[2] << 8);
     446              :                 pg_fallthrough;
     447              :             case 2:
     448              :                 a += ((uint32) k[1] << 16);
     449              :                 pg_fallthrough;
     450              :             case 1:
     451              :                 a += ((uint32) k[0] << 24);
     452              :                 /* case 0: nothing left to add */
     453              :         }
     454              : #else                           /* !WORDS_BIGENDIAN */
     455      2829414 :         switch (len)
     456              :         {
     457         4050 :             case 11:
     458         4050 :                 c += ((uint32) k[10] << 24);
     459              :                 pg_fallthrough;
     460         8990 :             case 10:
     461         8990 :                 c += ((uint32) k[9] << 16);
     462              :                 pg_fallthrough;
     463        14237 :             case 9:
     464        14237 :                 c += ((uint32) k[8] << 8);
     465              :                 pg_fallthrough;
     466        28893 :             case 8:
     467              :                 /* the lowest byte of c is reserved for the length */
     468        28893 :                 b += ka[1];
     469        28893 :                 a += ka[0];
     470        28893 :                 break;
     471      1482598 :             case 7:
     472      1482598 :                 b += ((uint32) k[6] << 16);
     473              :                 pg_fallthrough;
     474      1668217 :             case 6:
     475      1668217 :                 b += ((uint32) k[5] << 8);
     476              :                 pg_fallthrough;
     477      1691447 :             case 5:
     478      1691447 :                 b += k[4];
     479              :                 pg_fallthrough;
     480      2351457 :             case 4:
     481      2351457 :                 a += ka[0];
     482      2351457 :                 break;
     483         8177 :             case 3:
     484         8177 :                 a += ((uint32) k[2] << 16);
     485              :                 pg_fallthrough;
     486        14296 :             case 2:
     487        14296 :                 a += ((uint32) k[1] << 8);
     488              :                 pg_fallthrough;
     489        18910 :             case 1:
     490        18910 :                 a += k[0];
     491              :                 /* case 0: nothing left to add */
     492              :         }
     493              : #endif                          /* WORDS_BIGENDIAN */
     494              :     }
     495              :     else
     496              :     {
     497              :         /* Code path for non-aligned source data */
     498              : 
     499              :         /* handle most of the key */
     500          114 :         while (len >= 12)
     501              :         {
     502              : #ifdef WORDS_BIGENDIAN
     503              :             a += (k[3] + ((uint32) k[2] << 8) + ((uint32) k[1] << 16) + ((uint32) k[0] << 24));
     504              :             b += (k[7] + ((uint32) k[6] << 8) + ((uint32) k[5] << 16) + ((uint32) k[4] << 24));
     505              :             c += (k[11] + ((uint32) k[10] << 8) + ((uint32) k[9] << 16) + ((uint32) k[8] << 24));
     506              : #else                           /* !WORDS_BIGENDIAN */
     507            6 :             a += (k[0] + ((uint32) k[1] << 8) + ((uint32) k[2] << 16) + ((uint32) k[3] << 24));
     508            6 :             b += (k[4] + ((uint32) k[5] << 8) + ((uint32) k[6] << 16) + ((uint32) k[7] << 24));
     509            6 :             c += (k[8] + ((uint32) k[9] << 8) + ((uint32) k[10] << 16) + ((uint32) k[11] << 24));
     510              : #endif                          /* WORDS_BIGENDIAN */
     511            6 :             mix(a, b, c);
     512            6 :             k += 12;
     513            6 :             len -= 12;
     514              :         }
     515              : 
     516              :         /* handle the last 11 bytes */
     517              : #ifdef WORDS_BIGENDIAN
     518              :         switch (len)
     519              :         {
     520              :             case 11:
     521              :                 c += ((uint32) k[10] << 8);
     522              :                 pg_fallthrough;
     523              :             case 10:
     524              :                 c += ((uint32) k[9] << 16);
     525              :                 pg_fallthrough;
     526              :             case 9:
     527              :                 c += ((uint32) k[8] << 24);
     528              :                 pg_fallthrough;
     529              :             case 8:
     530              :                 /* the lowest byte of c is reserved for the length */
     531              :                 b += k[7];
     532              :                 pg_fallthrough;
     533              :             case 7:
     534              :                 b += ((uint32) k[6] << 8);
     535              :                 pg_fallthrough;
     536              :             case 6:
     537              :                 b += ((uint32) k[5] << 16);
     538              :                 pg_fallthrough;
     539              :             case 5:
     540              :                 b += ((uint32) k[4] << 24);
     541              :                 pg_fallthrough;
     542              :             case 4:
     543              :                 a += k[3];
     544              :                 pg_fallthrough;
     545              :             case 3:
     546              :                 a += ((uint32) k[2] << 8);
     547              :                 pg_fallthrough;
     548              :             case 2:
     549              :                 a += ((uint32) k[1] << 16);
     550              :                 pg_fallthrough;
     551              :             case 1:
     552              :                 a += ((uint32) k[0] << 24);
     553              :                 /* case 0: nothing left to add */
     554              :         }
     555              : #else                           /* !WORDS_BIGENDIAN */
     556          108 :         switch (len)
     557              :         {
     558            0 :             case 11:
     559            0 :                 c += ((uint32) k[10] << 24);
     560              :                 pg_fallthrough;
     561            6 :             case 10:
     562            6 :                 c += ((uint32) k[9] << 16);
     563              :                 pg_fallthrough;
     564            6 :             case 9:
     565            6 :                 c += ((uint32) k[8] << 8);
     566              :                 pg_fallthrough;
     567           30 :             case 8:
     568              :                 /* the lowest byte of c is reserved for the length */
     569           30 :                 b += ((uint32) k[7] << 24);
     570              :                 pg_fallthrough;
     571           36 :             case 7:
     572           36 :                 b += ((uint32) k[6] << 16);
     573              :                 pg_fallthrough;
     574           36 :             case 6:
     575           36 :                 b += ((uint32) k[5] << 8);
     576              :                 pg_fallthrough;
     577           46 :             case 5:
     578           46 :                 b += k[4];
     579              :                 pg_fallthrough;
     580           52 :             case 4:
     581           52 :                 a += ((uint32) k[3] << 24);
     582              :                 pg_fallthrough;
     583           70 :             case 3:
     584           70 :                 a += ((uint32) k[2] << 16);
     585              :                 pg_fallthrough;
     586           76 :             case 2:
     587           76 :                 a += ((uint32) k[1] << 8);
     588              :                 pg_fallthrough;
     589          108 :             case 1:
     590          108 :                 a += k[0];
     591              :                 /* case 0: nothing left to add */
     592              :         }
     593              : #endif                          /* WORDS_BIGENDIAN */
     594              :     }
     595              : 
     596      2829522 :     final(a, b, c);
     597              : 
     598              :     /* report the result */
     599      2829522 :     return ((uint64) b << 32) | c;
     600              : }
     601              : 
     602              : /*
     603              :  * hash_bytes_uint32() -- hash a 32-bit value to a 32-bit value
     604              :  *
     605              :  * This has the same result as
     606              :  *      hash_bytes(&k, sizeof(uint32))
     607              :  * but is faster and doesn't force the caller to store k into memory.
     608              :  */
     609              : uint32
     610     68283895 : hash_bytes_uint32(uint32 k)
     611              : {
     612              :     uint32      a,
     613              :                 b,
     614              :                 c;
     615              : 
     616     68283895 :     a = b = c = 0x9e3779b9 + (uint32) sizeof(uint32) + 3923095;
     617     68283895 :     a += k;
     618              : 
     619     68283895 :     final(a, b, c);
     620              : 
     621              :     /* report the result */
     622     68283895 :     return c;
     623              : }
     624              : 
     625              : /*
     626              :  * hash_bytes_uint32_extended() -- hash 32-bit value to 64-bit value, with seed
     627              :  *
     628              :  * Like hash_bytes_uint32, this is a convenience function.
     629              :  */
     630              : uint64
     631       183262 : hash_bytes_uint32_extended(uint32 k, uint64 seed)
     632              : {
     633              :     uint32      a,
     634              :                 b,
     635              :                 c;
     636              : 
     637       183262 :     a = b = c = 0x9e3779b9 + (uint32) sizeof(uint32) + 3923095;
     638              : 
     639       183262 :     if (seed != 0)
     640              :     {
     641       182911 :         a += (uint32) (seed >> 32);
     642       182911 :         b += (uint32) seed;
     643       182911 :         mix(a, b, c);
     644              :     }
     645              : 
     646       183262 :     a += k;
     647              : 
     648       183262 :     final(a, b, c);
     649              : 
     650              :     /* report the result */
     651       183262 :     return ((uint64) b << 32) | c;
     652              : }
     653              : 
     654              : /*
     655              :  * string_hash: hash function for keys that are NUL-terminated strings.
     656              :  *
     657              :  * NOTE: this is the default hash function if none is specified.
     658              :  */
     659              : uint32
     660      1524169 : string_hash(const void *key, Size keysize)
     661              : {
     662              :     /*
     663              :      * If the string exceeds keysize-1 bytes, we want to hash only that many,
     664              :      * because when it is copied into the hash table it will be truncated at
     665              :      * that length.
     666              :      */
     667      1524169 :     Size        s_len = strlen((const char *) key);
     668              : 
     669      1524169 :     s_len = Min(s_len, keysize - 1);
     670      1524169 :     return hash_bytes((const unsigned char *) key, (int) s_len);
     671              : }
     672              : 
     673              : /*
     674              :  * tag_hash: hash function for fixed-size tag values
     675              :  */
     676              : uint32
     677    169336642 : tag_hash(const void *key, Size keysize)
     678              : {
     679    169336642 :     return hash_bytes((const unsigned char *) key, (int) keysize);
     680              : }
     681              : 
     682              : /*
     683              :  * uint32_hash: hash function for keys that are uint32 or int32
     684              :  *
     685              :  * (tag_hash works for this case too, but is slower)
     686              :  */
     687              : uint32
     688     36128763 : uint32_hash(const void *key, Size keysize)
     689              : {
     690              :     Assert(keysize == sizeof(uint32));
     691     36128763 :     return hash_bytes_uint32(*((const uint32 *) key));
     692              : }
        

Generated by: LCOV version 2.0-1