2 * Copyright (c) 2016, Olivier MATZ <zer0@droids-corp.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of California, Berkeley nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 * MurmurHash3 is a hash implementation that was written by Austin Appleby, and
30 * is placed in the public domain. The author hereby disclaims copyright to this
34 #ifndef ECOLI_MURMURHASH_H_
35 #define ECOLI_MURMURHASH_H_
40 static inline uint32_t ec_murmurhash_rotl32(uint32_t x, int8_t r)
42 return (x << r) | (x >> (32 - r));
45 /** Add 32-bit to the hash */
46 static inline uint32_t ec_murmurhash3_add32(uint32_t h, uint32_t data)
49 data = ec_murmurhash_rotl32(data, 15);
55 /** Intermediate mix */
56 static inline uint32_t ec_murmurhash3_mix32(uint32_t h)
58 h = ec_murmurhash_rotl32(h,13);
59 h = h * 5 +0xe6546b64;
63 /** Final mix: force all bits of a hash block to avalanche */
64 static inline uint32_t ec_murmurhash3_fmix32(uint32_t h)
76 * Calculate a 32-bit murmurhash3
79 * The key (the unaligned variable-length array of bytes).
81 * The length of the key, counting by bytes.
83 * Can be any 4-byte value initialization value.
87 uint32_t ec_murmurhash3(const void *key, int len, uint32_t seed);
89 #endif /* ECOLI_MURMURHASH_H_ */