FireBirdLib - Topfield TMS PVR TAP Programming Library
SuperFastHash.c
Go to the documentation of this file.
1#include "libFireBird.h"
2
3#undef get16bits
4#if(defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
5 || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
6#define get16bits(d) (*((const word *) (d)))
7#endif
8
9#if !defined (get16bits)
10#define get16bits(d) ((((const byte *)(d))[1] << (dword)(8))\
11 +((const byte *)(d))[0])
12#endif
13
14dword SuperFastHash(register unsigned char * data, int len, dword hash)
15{
16 TRACEENTER();
17
18 register dword tmp, tmp2;
19 int rem;
20
21 if(len <= 0 || data == NULL)
22 {
23 TRACEEXIT();
24 return 0;
25 }
26
27 rem = len & 3;
28 len >>= 2;
29
30 /* Main loop */
31 while(len>0)
32 {
33 tmp = get16bits(data);
34 data += 2;
35 tmp2 = get16bits(data);
36 data += 2;
37 if(tmp || tmp2)
38 {
39 hash += tmp;
40 tmp2 <<= 11;
41 tmp2 ^= hash;
42 hash <<= 16;
43 hash ^= tmp2;
44 hash += hash >> 11;
45 }
46 len -= 4;
47 }
48
49 /* Handle end cases */
50 switch(rem)
51 {
52 case 3:
53 hash += get16bits(data);
54 hash ^= hash << 16;
55 hash ^= data[sizeof(word)] << 18;
56 hash += hash >> 11;
57 break;
58
59 case 2:
60 hash += get16bits(data);
61 hash ^= hash << 11;
62 hash += hash >> 17;
63 break;
64
65 case 1:
66 hash += *data;
67 hash ^= hash << 10;
68 hash += hash >> 1;
69 break;
70 }
71
72 /* Force "avalanching" of final 127 bits */
73 hash ^= hash << 3;
74 hash += hash >> 5;
75 hash ^= hash << 2;
76 hash += hash >> 15;
77 hash ^= hash << 10;
78 hash += (hash << 16) | (hash >> 16);
79
80 TRACEEXIT();
81 return hash;
82}
dword SuperFastHash(register unsigned char *data, int len, dword hash)
Definition: SuperFastHash.c:14
#define get16bits(d)
Definition: SuperFastHash.c:10
#define TRACEEXIT()
Definition: libFireBird.h:1244
#define TRACEENTER()
Definition: libFireBird.h:1243