diff options
Diffstat (limited to 'contrib/murmurhash3')
l--------- | contrib/murmurhash3/LICENSE | 1 | ||||
-rw-r--r-- | contrib/murmurhash3/murmurhash3.c | 77 | ||||
-rw-r--r-- | contrib/murmurhash3/murmurhash3.h | 9 | ||||
-rw-r--r-- | contrib/murmurhash3/murmurhash3.spdx | 10 |
4 files changed, 97 insertions, 0 deletions
diff --git a/contrib/murmurhash3/LICENSE b/contrib/murmurhash3/LICENSE new file mode 120000 index 0000000..fe25b01 --- /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 0000000..995c236 --- /dev/null +++ b/contrib/murmurhash3/murmurhash3.c @@ -0,0 +1,77 @@ +/* This is MurmurHash3. The original C++ code was placed in the public domain + * by its author, Austin Appleby. + * + * SPDX-License-Identifier: CC0-1.0 + * Source: https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */ + +#include "murmurhash3.h" +#include "string.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 + + int i; + for(i = -nblocks; i; i++) + { + uint32_t k1; + memcpy(&k1, data + nblocks * 4 + i * sizeof(k1), sizeof(k1)); + + 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 0000000..d849961 --- /dev/null +++ b/contrib/murmurhash3/murmurhash3.h @@ -0,0 +1,9 @@ +/* SPDX-License-Identifier: CC0-1.0 + * Source: https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */ + +#pragma once + +#include <stdlib.h> +#include <stdint.h> + +uint32_t hash(const char* data, size_t len); diff --git a/contrib/murmurhash3/murmurhash3.spdx b/contrib/murmurhash3/murmurhash3.spdx new file mode 100644 index 0000000..7ce5a54 --- /dev/null +++ b/contrib/murmurhash3/murmurhash3.spdx @@ -0,0 +1,10 @@ +SPDXVersion: SPDX-2.1 +DataLicense: CC0-1.0 +SPDXID: SPDXRef-DOCUMENT +DocumentName: ccan-json +DocumentNamespace: http://spdx.org/spdxdocs/spdx-v2.1-d9b4db4c-062f-4add-89b6-f603224f5a2c + +PackageName: json +PackageDownloadLocation: git+https://github.com/aappleby/smhasher.git@73e075b203d9c76cd1e20d6c8907c2983d653f33#MurmurHash3.cpp +PackageOriginator: Person: Austin Appleby (aappleby@gmail.com) +PackageLicenseDeclared: CC0-1.0 |