Перейти к содержимому

6

Более быстрая версия 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 платформе возможности нет...