12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Modified by Russ Cox to add "namespace re2".
22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Also threw away all but hashword and hashword2.
32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// http://burtleburtle.net/bob/c/lookup3.c
42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson/*
62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonlookup3.c, by Bob Jenkins, May 2006, Public Domain.
82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThese are functions for producing 32-bit hashes for hash table lookup.
102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonhashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonare externally useful functions.  Routines to test the hash are included
122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonif SELF_TEST is defined.  You can use this free for any purpose.  It's in
132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthe public domain.  It has no warranty.
142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonYou probably want to use hashlittle().  hashlittle() and hashbig()
162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonhash byte arrays.  hashlittle() is is faster than hashbig() on
172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonlittle-endian machines.  Intel and AMD are little-endian machines.
182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonOn second thought, you probably want hashlittle2(), which is identical to
192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonhashlittle() except it returns two 32-bit hashes for the price of one.
202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonYou could implement hashbig2() if you wanted but I haven't bothered here.
212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonIf you want to find a hash of, say, exactly 7 integers, do
232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a = i1;  b = i2;  c = i3;
242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  mix(a,b,c);
252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a += i4; b += i5; c += i6;
262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  mix(a,b,c);
272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a += i7;
282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  final(a,b,c);
292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthen use c as the hash value.  If you have a variable length array of
302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson4-byte integers to hash, use hashword().  If you have a byte array (like
312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsona character string), use hashlittle().  If you have several byte arrays, or
322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsona mix of things, see the comments above hashlittle().
332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonWhy is this so big?  I read 12 bytes at a time into 3 4-byte integers,
352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthen mix those integers.  This is fast (you can do a lot more thorough
362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonmixing with 12*3 instructions on 3 integers than you can with 3 instructions
372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonon 1 byte), but shoehorning those bytes into integers efficiently is messy.
382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson*/
402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#include "util/util.h"
422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson/*
462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonmix -- mix 3 32-bit values reversibly.
482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThis is reversible, so any information in (a,b,c) before mix() is
502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstill in (a,b,c) after mix().
512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonIf four pairs of (a,b,c) inputs are run through mix(), or through
532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonmix() in reverse, there are at least 32 bits of the output that
542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonare sometimes the same for one pair and different for another pair.
552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThis was tested for:
562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* pairs that differed by one bit, by two bits, in any combination
572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  of top bits of (a,b,c), or in any combination of bottom bits of
582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  (a,b,c).
592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  is commonly produced by subtraction) look like a single 1-bit
622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  difference.
632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* the base values were pseudorandom, all zero but one bit set, or
642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  all zero plus a counter that starts at zero.
652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonSome k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsatisfy this are
682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    4  6  8 16 19  4
692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    9 15  3 18 27 15
702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson   14  9  3  7 17  3
712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonWell, "9 15 3 18 27 15" didn't quite get 32 bits diffing
722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonfor "differ" defined as + with a one-bit base and a two-bit delta.  I
732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonused http://burtleburtle.net/bob/hash/avalanche.html to choose
742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthe operations, constants, and arrangements of the variables.
752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThis does not achieve avalanche.  There are input bits of (a,b,c)
772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthat fail to affect some output bits of (a,b,c), especially of a.  The
782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonmost thoroughly mixed value is c, but it doesn't really even achieve
792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonavalanche in c.
802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThis allows some parallelism.  Read-after-writes are good at doubling
822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonthe number of bits affected, so the goal of mixing pulls in the opposite
832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsondirection as the goal of parallelism.  I did what I could.  Rotates
842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonseem to cost as much as shifts on every machine I could lay my hands
852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonon, and rotates are much kinder to the top and bottom bits, so I used
862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonrotates.
872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson*/
892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define mix(a,b,c) \
902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{ \
912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a -= c;  a ^= rot(c, 4);  c += b; \
922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  b -= a;  b ^= rot(a, 6);  a += c; \
932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c -= b;  c ^= rot(b, 8);  b += a; \
942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a -= c;  a ^= rot(c,16);  c += b; \
952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  b -= a;  b ^= rot(a,19);  a += c; \
962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c -= b;  c ^= rot(b, 4);  b += a; \
972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson/*
1002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
1012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonfinal -- final mixing of 3 32-bit values (a,b,c) into c
1022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonPairs of (a,b,c) values differing in only a few bits will usually
1042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonproduce values of c that look totally different.  This was tested for
1052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* pairs that differed by one bit, by two bits, in any combination
1062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  of top bits of (a,b,c), or in any combination of bottom bits of
1072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  (a,b,c).
1082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* "differ" is defined as +, -, ^, or ~^.  For + and -, I transformed
1092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
1102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  is commonly produced by subtraction) look like a single 1-bit
1112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  difference.
1122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson* the base values were pseudorandom, all zero but one bit set, or
1132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  all zero plus a counter that starts at zero.
1142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian HodsonThese constants passed:
1162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 14 11 25 16 4 14 24
1172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 12 14 25 16 4 14 24
1182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonand these came close:
1192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  4  8 15 26 3 22 24
1202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 10  8 15 26 3 22 24
1212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson 11  8 15 26 3 22 24
1222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson-------------------------------------------------------------------------------
1232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson*/
1242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define final(a,b,c) \
1252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{ \
1262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c ^= b; c -= rot(b,14); \
1272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a ^= c; a -= rot(c,11); \
1282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  b ^= a; b -= rot(a,25); \
1292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c ^= b; c -= rot(b,16); \
1302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a ^= c; a -= rot(c,4);  \
1312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  b ^= a; b -= rot(a,14); \
1322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c ^= b; c -= rot(b,24); \
1332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace re2 {
1362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson/*
1382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson--------------------------------------------------------------------
1392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson This works on all machines.  To be useful, it requires
1402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson -- that the key be an array of uint32_t's, and
1412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson -- that the length be the number of uint32_t's in the key
1422ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1432ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson The function hashword() is identical to hashlittle() on little-endian
1442ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson machines, and identical to hashbig() on big-endian machines,
1452ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson except that the length has to be measured in uint32_ts rather than in
1462ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson bytes.  hashlittle() is more complicated than hashword() only because
1472ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson hashlittle() has to dance around fitting the key bytes into registers.
1482ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson--------------------------------------------------------------------
1492ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson*/
1502ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32 hashword(
1512ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonconst uint32 *k,                   /* the key, an array of uint32_t values */
1522ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsize_t          length,               /* the length of the key, in uint32_ts */
1532ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32        initval)         /* the previous hash, or an arbitrary value */
1542ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{
1552ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  uint32_t a,b,c;
1562ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1572ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /* Set up the internal state */
1582ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a = b = c = 0xdeadbeef + (((uint32_t)length)<<2) + initval;
1592ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1602ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------------- handle most of the key */
1612ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  while (length > 3)
1622ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  {
1632ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    a += k[0];
1642ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    b += k[1];
1652ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    c += k[2];
1662ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    mix(a,b,c);
1672ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    length -= 3;
1682ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    k += 3;
1692ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  }
1702ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1712ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------- handle the last 3 uint32_t's */
1722ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  switch(length)                     /* all the case statements fall through */
1732ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  {
1742ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 3 : c+=k[2];
1752ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 2 : b+=k[1];
1762ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 1 : a+=k[0];
1772ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    final(a,b,c);
1782ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 0:     /* case 0: nothing left to add */
1792ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    break;
1802ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  }
1812ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------------------ report the result */
1822ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  return c;
1832ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
1842ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1852ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
1862ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson/*
1872ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson--------------------------------------------------------------------
1882ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonhashword2() -- same as hashword(), but take two seeds and return two
1892ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson32-bit values.  pc and pb must both be nonnull, and *pc and *pb must
1902ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonboth be initialized with seeds.  If you pass in (*pb)==0, the output
1912ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson(*pc) will be the same as the return value from hashword().
1922ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson--------------------------------------------------------------------
1932ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson*/
1942ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid hashword2 (
1952ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonconst uint32 *k,                   /* the key, an array of uint32_t values */
1962ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonsize_t          length,               /* the length of the key, in uint32_ts */
1972ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32       *pc,                      /* IN: seed OUT: primary hash value */
1982ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonuint32       *pb)               /* IN: more seed OUT: secondary hash value */
1992ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson{
2002ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  uint32_t a,b,c;
2012ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
2022ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /* Set up the internal state */
2032ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  a = b = c = 0xdeadbeef + ((uint32_t)(length<<2)) + *pc;
2042ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  c += *pb;
2052ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
2062ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------------- handle most of the key */
2072ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  while (length > 3)
2082ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  {
2092ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    a += k[0];
2102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    b += k[1];
2112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    c += k[2];
2122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    mix(a,b,c);
2132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    length -= 3;
2142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    k += 3;
2152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  }
2162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
2172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------- handle the last 3 uint32_t's */
2182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  switch(length)                     /* all the case statements fall through */
2192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  {
2202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 3 : c+=k[2];
2212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 2 : b+=k[1];
2222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 1 : a+=k[0];
2232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    final(a,b,c);
2242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  case 0:     /* case 0: nothing left to add */
2252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson    break;
2262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  }
2272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  /*------------------------------------------------------ report the result */
2282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  *pc=c; *pb=b;
2292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}
2302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
2312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}  // namespace re2
232