int open(char *, int, int); long read(int, unsigned char *, unsigned long); int printf(char *, ...); void *malloc(unsigned long); void exit(int); void PMurHash32_Process(unsigned int *ph1, unsigned int *pcarry, void *key, int len) { unsigned int h1 = *ph1; unsigned int c = *pcarry; int n = c & 3; int i = (4 - n) & 3; unsigned char *ptr = (unsigned char *)key; unsigned char *end; if (i && i <= len) { do { int _i = i; while (_i--) { c = c >> 8 | *ptr++ << 24; n++; len--; if (n == 4) { do { c *= (0xcc9e2d51); c = (((unsigned int)c << 15) | ((unsigned int)c >> (32 - 15))); c *= (0x1b873593); h1 ^= c; h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13))); h1 = h1 * 5 + 0xe6546b64; } while (0); n = 0; } } } while (0); } end = ptr + len / 4 * 4; for (; ptr < end; ptr += 4) { unsigned int k1; k1 = (ptr[0] | ptr[1] << 8 | ptr[2] << 16 | ptr[3] << 24); do { k1 *= (0xcc9e2d51); k1 = (((unsigned int)k1 << 15) | ((unsigned int)k1 >> (32 - 15))); k1 *= (0x1b873593); h1 ^= k1; h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13))); h1 = h1 * 5 + 0xe6546b64; } while (0); } len -= len / 4 * 4; do { int _i = len; while (_i--) { c = c >> 8 | *ptr++ << 24; n++; len--; if (n == 4) { do { c *= (0xcc9e2d51); c = (((unsigned int)c << 15) | ((unsigned int)c >> (32 - 15))); c *= (0x1b873593); h1 ^= c; h1 = (((unsigned int)h1 << 13) | ((unsigned int)h1 >> (32 - 13))); h1 = h1 * 5 + 0xe6546b64; } while (0); n = 0; } } } while (0); *ph1 = h1; *pcarry = (c & ~0xff) | n; } unsigned int PMurHash32_Result(unsigned int h, unsigned int carry, unsigned int total_length) { unsigned int k1; int n = carry & 3; if (n) { k1 = carry >> (4 - n) * 8; k1 *= (0xcc9e2d51); k1 = (((unsigned int)k1 << 15) | ((unsigned int)k1 >> (32 - 15))); k1 *= (0x1b873593); h ^= k1; } h ^= total_length; h ^= h >> 16; h *= 0x85ebca6b; h ^= h >> 13; h *= 0xc2b2ae35; h ^= h >> 16; return h; } unsigned int PMurHash32(unsigned int seed, void *key, int len) { unsigned int h1 = seed, carry = 0; PMurHash32_Process(&h1, &carry, key, len); return PMurHash32_Result(h1, carry, len); } void *read_file(int fd, int *len) { int size = 1500 * 1024 * 1024; unsigned char *arr = malloc(size); int i; for (i = 0; ;) { int rd = read(fd, arr + i, size - i); if (rd < 0) exit(2); if (rd == 0) break; i += rd; } *len = i; return arr; } int main(int argc, char **argv) { int fd, len; char *buf; fd = open(argv[1], 0, 0); if (fd == -1) return 1; buf = read_file(fd, &len); printf("len: %d\n", len); printf("%u\n", PMurHash32(0, buf, len)); return 0; }