-
Notifications
You must be signed in to change notification settings - Fork 12
/
MurmurHashNeutral2.h
61 lines (47 loc) · 1.23 KB
/
MurmurHashNeutral2.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*-----------------------------------------------------------------------------
* MurmurHashNeutral2, by Austin Appleby
*
* Same as MurmurHash2, but endian- and alignment-neutral.
* Half the speed though, alas.
*/
/* Code released into the public domain. */
/* C-ification and adaption to perl.h by Steffen Mueller 2009-11-03 */
#include "perl.h"
#ifndef _MurmurHashNeutral2_h_
#define _MurmurHashNeutral2_h_
U32 CXSA_MurmurHashNeutral2(const void* key, STRLEN len, U32 _seed) {
const unsigned int m = 0x5bd1e995;
const int r = 24;
unsigned int h = _seed ^ len;
const unsigned char* data = (const unsigned char*)key;
while (len >= 4) {
unsigned int k;
k = data[0];
k |= data[1] << 8;
k |= data[2] << 16;
k |= data[3] << 24;
k *= m;
k ^= k >> r;
k *= m;
h *= m;
h ^= k;
data += 4;
len -= 4;
}
switch(len) {
case 3:
h ^= data[2] << 16;
/* fall through */
case 2:
h ^= data[1] << 8;
/* fall through */
case 1:
h ^= data[0];
h *= m;
};
h ^= h >> 13;
h *= m;
h ^= h >> 15;
return (U32)h;
}
#endif