1 /*
2  * Perl XS for the Digest::Murmur Module
3  */
4 
5 #include "EXTERN.h"
6 #include "perl.h"
7 #include "XSUB.h"
8 
9 #include "ppport.h"
10 #include <string.h>
11 #include <stdint.h>
12 
13 U32
14 murmur_hash(char *data, size_t len) {
15   const uint32_t m  =  0x5bd1e995;
16   const uint8_t r   =  16;
17   uint32_t length   =  len;
18   uint32_t h        =  length * m;
19 
20   while (length >= 4) {
21     h += *(unsigned int *)data;
22     h *= m;
23     h ^= h >> r;
24     data += 4;
25     length -= 4;
26   }
27 
28   switch (length) {
29     case 3:
30       h += data[2] << 16;
31     case 2:
32       h += data[1] << 8;
33     case 1:
34       h += data[0];
35       h *= m;
36       h ^= h >> r;
37   }
38 
39   h *= m;
40   h ^= h >> 10;
41   h *= m;
42   h ^= h >> 17;
43 
44   return h;
45 }
46 
47 MODULE = Digest::MurmurHash	PACKAGE = Digest::MurmurHash
48 
49 U32 murmur_hash(char *data, size_t length(data))
50