• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "Platform.h"
2 #include <stdio.h> // for NULL
3 
4 /* By Paul Hsieh (C) 2004, 2005.  Covered under the Paul Hsieh derivative
5    license. See:
6    http://www.azillionmonkeys.com/qed/weblicense.html for license details.
7 
8    http://www.azillionmonkeys.com/qed/hash.html */
9 
10 /*
11 #undef get16bits
12 #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
13   || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
14 #define get16bits(d) (*((const uint16_t *) (d)))
15 #endif
16 
17 #if !defined (get16bits)
18 #define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)\
19                        +(uint32_t)(((const uint8_t *)(d))[0]) )
20 #endif
21 */
22 
get16bits(const void * p)23 FORCE_INLINE uint16_t get16bits ( const void * p )
24 {
25   return *(const uint16_t*)p;
26 }
27 
SuperFastHash(const signed char * data,int len)28 uint32_t SuperFastHash (const signed char * data, int len) {
29 uint32_t hash = 0, tmp;
30 int rem;
31 
32   if (len <= 0 || data == NULL) return 0;
33 
34   rem = len & 3;
35   len >>= 2;
36 
37   /* Main loop */
38   for (;len > 0; len--) {
39     hash  += get16bits (data);
40     tmp    = (get16bits (data+2) << 11) ^ hash;
41     hash   = (hash << 16) ^ tmp;
42     data  += 2*sizeof (uint16_t);
43     hash  += hash >> 11;
44   }
45 
46   /* Handle end cases */
47   switch (rem) {
48     case 3:	hash += get16bits (data);
49         hash ^= hash << 16;
50         hash ^= data[sizeof (uint16_t)] << 18;
51         hash += hash >> 11;
52         break;
53     case 2:	hash += get16bits (data);
54         hash ^= hash << 11;
55         hash += hash >> 17;
56         break;
57     case 1: hash += *data;
58         hash ^= hash << 10;
59         hash += hash >> 1;
60   }
61 
62   /* Force "avalanching" of final 127 bits */
63   hash ^= hash << 3;
64   hash += hash >> 5;
65   hash ^= hash << 4;
66   hash += hash >> 17;
67   hash ^= hash << 25;
68   hash += hash >> 6;
69 
70   return hash;
71 }
72 
SuperFastHash(const void * key,int len,uint32_t,void * out)73 void SuperFastHash     ( const void * key, int len, uint32_t /*seed*/, void * out )
74 {
75   *(uint32_t*)out = SuperFastHash((const signed char*)key,len);
76 }
77