Imported Upstream version 2.81
[platform/upstream/libbullet.git] / Extras / CDTestFramework / Opcode / Ice / IceHashing.h
1 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2 /**
3  *      Contains hashing code.
4  *      \file           IceHashing.h
5  *      \author         Pierre Terdiman
6  *      \date           May, 08, 1999
7  */
8 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
9
10 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
11 // Include Guard
12 #ifndef ICEHASHING_H
13 #define ICEHASHING_H
14
15         #define HashSize(n)     ((udword)1<<(n))
16         #define HashMask(n)     (HashSize(n)-1)
17
18         ICECORE_API udword Hash(const char* str);
19         ICECORE_API udword Hash(ubyte* k, udword length, udword initval);
20
21         // Bob Jenkin's hash
22         inline_ unsigned int Hash32Bits_0(unsigned int key)
23         {
24                 key += (key << 12);
25                 key ^= (key >> 22);
26                 key += (key << 4);
27                 key ^= (key >> 9);
28                 key += (key << 10);
29                 key ^= (key >> 2);
30                 key += (key << 7);
31                 key ^= (key >> 12);
32                 return key;
33         }
34
35         // Thomas Wang's hash
36         inline_ int Hash32Bits_1(int key)
37         {
38                 key += ~(key << 15);
39                 key ^=  (key >> 10);
40                 key +=  (key << 3);
41                 key ^=  (key >> 6);
42                 key += ~(key << 11);
43                 key ^=  (key >> 16);
44                 return key;
45         }
46
47         // Thomas Wang's hash
48         inline_ __int64 Hash64Bits_0(__int64 key)
49         {
50                 key += ~(key << 32);
51                 key ^= (key >> 22);
52                 key += ~(key << 13);
53                 key ^= (key >> 8);
54                 key += (key << 3);
55                 key ^= (key >> 15);
56                 key += ~(key << 27);
57                 key ^= (key >> 31);
58                 return key;
59         }
60
61         inline_ __int64 Hash64Bits_1(__int64 key)
62         {
63                 __int64 c1 = 0x6e5ea73858134343L;
64                 __int64 c2 = 0xb34e8f99a2ec9ef5L;
65                 key ^= ((c1 ^ key) >> 32);
66                 key *= c1;
67                 key ^= ((c2 ^ key) >> 31);
68                 key *= c2;
69                 key ^= ((c1 ^ key) >> 32);
70                 return key;
71         }
72
73         inline_ udword Hash(udword id0, udword id1)
74         {
75                 return Hash32Bits_1( (id0&0xffff)|(id1<<16) );
76         }
77
78 #endif // ICEHASHING_H