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
|
/*-----------------------------------------------------------------------------
* 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;
case 2: h ^= data[1] << 8;
case 1: h ^= data[0];
h *= m;
};
h ^= h >> 13;
h *= m;
h ^= h >> 15;
return (U32)h;
}
#endif
|