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