diff options
author | Vladimir Azarov <avm@intermediate-node.net> | 2025-08-18 03:59:02 +0200 |
---|---|---|
committer | Vladimir Azarov <avm@intermediate-node.net> | 2025-08-18 03:59:02 +0200 |
commit | dd775090878854ccfe65310f9457ce3e393c070d (patch) | |
tree | e942c0bc0e96e0eb170dfbcbe8d63a7635bba57a /test/benchmarks/murmur.c | |
parent | 177a172719f065dd32ea1217bfb35d6b640d0bad (diff) |
Diffstat (limited to 'test/benchmarks/murmur.c')
-rw-r--r-- | test/benchmarks/murmur.c | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/test/benchmarks/murmur.c b/test/benchmarks/murmur.c new file mode 100644 index 0000000..09a9441 --- /dev/null +++ b/test/benchmarks/murmur.c @@ -0,0 +1,138 @@ +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; +} |