store full token and completion in completed_item
[protos/libecoli.git] / lib / ecoli_murmurhash.h
1 /*
2  * Copyright (c) 2016, Olivier MATZ <zer0@droids-corp.org>
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
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.
15  *
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.
26  */
27
28 /**
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
31  * source code.
32  */
33
34 #ifndef ECOLI_MURMURHASH_H_
35 #define ECOLI_MURMURHASH_H_
36
37 #include <stdint.h>
38
39 /** Hash rotation */
40 static inline uint32_t ec_murmurhash_rotl32(uint32_t x, int8_t r)
41 {
42         return (x << r) | (x >> (32 - r));
43 }
44
45 /** Add 32-bit to the hash */
46 static inline uint32_t ec_murmurhash3_add32(uint32_t h, uint32_t data)
47 {
48         data *= 0xcc9e2d51;
49         data = ec_murmurhash_rotl32(data, 15);
50         data *= 0x1b873593;
51         h ^= data;
52         return h;
53 }
54
55 /** Intermediate mix */
56 static inline uint32_t ec_murmurhash3_mix32(uint32_t h)
57 {
58         h = ec_murmurhash_rotl32(h,13);
59         h = h * 5 +0xe6546b64;
60         return h;
61 }
62
63 /** Final mix: force all bits of a hash block to avalanche */
64 static inline uint32_t ec_murmurhash3_fmix32(uint32_t h)
65 {
66         h ^= h >> 16;
67         h *= 0x85ebca6b;
68         h ^= h >> 13;
69         h *= 0xc2b2ae35;
70         h ^= h >> 16;
71
72         return h;
73 }
74
75 /**
76  * Calculate a 32-bit murmurhash3
77  *
78  * @param key
79  *   The key (the unaligned variable-length array of bytes).
80  * @param len
81  *   The length of the key, counting by bytes.
82  * @param seed
83  *   Can be any 4-byte value initialization value.
84  * @return
85  *   A 32-bit hash.
86  */
87 uint32_t ec_murmurhash3(const void *key, int len, uint32_t seed);
88
89 #endif /* ECOLI_MURMURHASH_H_ */