hash.cc revision 2ee91b4af4353b9e6a9d591c32fedfc58fd4ef35
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