Более быстрая версия MurmurHash 2.0, не чувствительная к порядку записи байтов целого:
#include<stdio.h>
#include <netinet/in.h>
#define mmix(h,k) { k *= m; k ^= k >> r; k *= m; h *= m; h ^= k; }
unsigned int MurmurHash2B ( const void * key, int len, unsigned int seed )
{
const unsigned int m = 0x5bd1e995;
const int r = 24;
unsigned int l = len;
const unsigned char * data = (const unsigned char *)key;
unsigned int h = seed;
while(len >= 4)
{
unsigned int k = htonl(*(unsigned int*)data);
mmix(h,k);
data += 4;
len -= 4;
}
unsigned int t = 0;
switch(len)
{
case 3: t ^= data[2] << 16;
case 2: t ^= data[1] << 8;
case 1: t ^= data[0];
};
mmix(h,t);
mmix(h,l);
h ^= h >> 13;
h *= m;
h ^= h >> 15;
return h;
}
main() {
char testKey[] = "Hello, World!";
unsigned int h = MurmurHash2B(testKey, sizeof(testKey), 0);
printf("h=%08x\n", h);
}
Результат выполнения на little-endian (x86):
h=5bc5cf02
Проверить на big-endian платформе возможности нет...