diff --git a/contrib/murmurhash3/LICENSE b/contrib/murmurhash3/LICENSE new file mode 120000 index 0000000000000000000000000000000000000000..fe25b01381c294b764990ae5423c019d185c4558 --- /dev/null +++ b/contrib/murmurhash3/LICENSE @@ -0,0 +1 @@ +../licenses/CC0 \ No newline at end of file diff --git a/contrib/murmurhash3/murmurhash3.c b/contrib/murmurhash3/murmurhash3.c new file mode 100644 index 0000000000000000000000000000000000000000..223ced56a0121ce7978d50b9baef46a70863c209 --- /dev/null +++ b/contrib/murmurhash3/murmurhash3.c @@ -0,0 +1,74 @@ +/* This is MurmurHash3. The original C++ code was placed in the public domain + * by its author, Austin Appleby. */ + +#include "libknot/internal/trie/murmurhash3.h" + +static inline uint32_t fmix(uint32_t h) +{ + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; +} + +static inline uint32_t rotl32(uint32_t x, int8_t r) +{ + return (x << r) | (x >> (32 - r)); +} + +uint32_t hash(const char* data, size_t len_) +{ + const int len = (int) len_; + const int nblocks = len / 4; + + uint32_t h1 = 0xc062fb4a; + + uint32_t c1 = 0xcc9e2d51; + uint32_t c2 = 0x1b873593; + + //---------- + // body + + const uint32_t * blocks = (const uint32_t*) (data + nblocks * 4); + + int i; + for(i = -nblocks; i; i++) + { + uint32_t k1 = blocks[i]; + + k1 *= c1; + k1 = rotl32(k1, 15); + k1 *= c2; + + h1 ^= k1; + h1 = rotl32(h1, 13); + h1 = h1*5+0xe6546b64; + } + + //---------- + // tail + + const uint8_t * tail = (const uint8_t*)(data + nblocks*4); + + uint32_t k1 = 0; + + switch(len & 3) + { + case 3: k1 ^= tail[2] << 16; + case 2: k1 ^= tail[1] << 8; + case 1: k1 ^= tail[0]; + k1 *= c1; k1 = rotl32(k1,15); k1 *= c2; h1 ^= k1; + } + + //---------- + // finalization + + h1 ^= len; + + h1 = fmix(h1); + + return h1; +} diff --git a/contrib/murmurhash3/murmurhash3.h b/contrib/murmurhash3/murmurhash3.h new file mode 100644 index 0000000000000000000000000000000000000000..b4507b3ae197c82bd71c91ac5069aeb2624cde08 --- /dev/null +++ b/contrib/murmurhash3/murmurhash3.h @@ -0,0 +1,6 @@ +#pragma once + +#include <stdlib.h> +#include <stdint.h> + +uint32_t hash(const char* data, size_t len); diff --git a/lib/lib.mk b/lib/lib.mk index f43b38b8d73fbd301cd297c7849e0ed2bac5ef87..323a8a1ecfd121cadfce17e359a2f834b90670c4 100644 --- a/lib/lib.mk +++ b/lib/lib.mk @@ -1,6 +1,7 @@ ccan_EMBED := \ contrib/ccan/ilog/ilog.c \ - contrib/ccan/isaac/isaac.c + contrib/ccan/isaac/isaac.c \ + contrib/murmurhash3/murmurhash3.c libkresolve_SOURCES := \ $(ccan_EMBED) \