1 /* Source : https://en.wikipedia.org/wiki/MurmurHash */
2 /* Source : http://www.eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */
6 unsigned ring_hash(unsigned pid)
8 return pid / 1000 % 100;
11 unsigned ring_add_hash(unsigned char *key, int len)
13 unsigned char *p = key;
17 for (i = 0; i < len; i++)
25 unsigned ring_xor_hash(unsigned char *key, int len)
27 unsigned char *p = key;
31 for (i = 0; i < len; i++)
39 unsigned ring_rot_hash(unsigned char *key, int len)
41 unsigned char *p = key;
45 for (i = 0; i < len; i++)
47 h = (h << 4) ^ (h >> 28) ^ p[i];
53 unsigned ring_djb_hash(unsigned char *key, int len)
55 unsigned char *p = key;
59 for (i = 0; i < len; i++)
67 unsigned ring_sax_hash(unsigned char *key, int len)
69 unsigned char *p = key;
73 for (i = 0; i < len; i++)
75 h ^= (h << 5) + (h >> 2) + p[i];
81 unsigned ring_oat_hash(unsigned char *key, int len)
83 unsigned char *p = key;
87 for (i = 0; i < len; i++)
100 unsigned ring_elf_hash(unsigned char *key, int len)
102 unsigned char *p = key;
106 for (i = 0; i < len; i++)
122 #define hashsize(n) (1U << (n))
123 #define hashmask(n) (hashsize(n) - 1)
127 a -= b; a -= c; a ^= (c >> 13); \
128 b -= c; b -= a; b ^= (a << 8); \
129 c -= a; c -= b; c ^= (b >> 13); \
130 a -= b; a -= c; a ^= (c >> 12); \
131 b -= c; b -= a; b ^= (a << 16); \
132 c -= a; c -= b; c ^= (b >> 5); \
133 a -= b; a -= c; a ^= (c >> 3); \
134 b -= c; b -= a; b ^= (a << 10); \
135 c -= a; c -= b; c ^= (b >> 15); \
138 unsigned ring_jen_hash(unsigned char *k, unsigned length, unsigned initval)
141 unsigned c = initval;
142 unsigned len = length;
148 a += (k[0] + ((unsigned)k[1] << 8) + ((unsigned)k[2] << 16) + ((unsigned)k[3] << 24));
149 b += (k[4] + ((unsigned)k[5] << 8) + ((unsigned)k[6] << 16) + ((unsigned)k[7] << 24));
150 c += (k[8] + ((unsigned)k[9] << 8) + ((unsigned)k[10] << 16) + ((unsigned)k[11] << 24));
162 case 11: c += ((unsigned)k[10] << 24);
163 case 10: c += ((unsigned)k[9] << 16);
164 case 9: c += ((unsigned)k[8] << 8);
165 /* First byte of c reserved for length */
166 case 8: b += ((unsigned)k[7] << 24);
167 case 7: b += ((unsigned)k[6] << 16);
168 case 6: b += ((unsigned)k[5] << 8);
170 case 4: a += ((unsigned)k[3] << 24);
171 case 3: a += ((unsigned)k[2] << 16);
172 case 2: a += ((unsigned)k[1] << 8);
181 unsigned int ring_murmur3_32(const char *key, unsigned int len, unsigned int seed) {
182 static const unsigned int c1 = 0xcc9e2d51;
183 static const unsigned int c2 = 0x1b873593;
184 static const unsigned int r1 = 15;
185 static const unsigned int r2 = 13;
186 static const unsigned int m = 5;
187 static const unsigned int n = 0xe6546b64;
189 unsigned int hash = seed;
191 const int nblocks = len / 4;
192 const unsigned int *blocks = (const unsigned int *) key;
195 const unsigned char *tail ;
198 for (i = 0; i < nblocks; i++) {
199 unsigned int k = blocks[i];
201 k = (k << r1) | (k >> (32 - r1));
205 hash = ((hash << r2) | (hash >> (32 - r2))) * m + n;
208 tail = (const unsigned char *) (key + nblocks * 4);
219 k1 = (k1 << r1) | (k1 >> (32 - r1));
225 hash ^= (hash >> 16);
227 hash ^= (hash >> 13);
229 hash ^= (hash >> 16);