/src/adhd/third_party/superfasthash/sfh.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* Copyright (c) 2010, Paul Hsieh |
2 | | * All rights reserved. |
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 notice, this |
8 | | * list of conditions and the following disclaimer. |
9 | | * * Redistributions in binary form must reproduce the above copyright notice, |
10 | | * this list of conditions and the following disclaimer in the documentation |
11 | | * and/or other materials provided with the distribution. |
12 | | * * Neither my name, Paul Hsieh, nor the names of any other contributors to the |
13 | | * code use may not be used to endorse or promote products derived from this |
14 | | * software without specific prior written permission. |
15 | | * |
16 | | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
17 | | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
18 | | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
19 | | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE |
20 | | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
21 | | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
22 | | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
23 | | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
24 | | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
25 | | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
26 | | * POSSIBILITY OF SUCH DAMAGE. |
27 | | */ |
28 | | |
29 | | #include <stddef.h> |
30 | | #include <stdint.h> |
31 | | |
32 | | #undef get16bits |
33 | | #if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) || \ |
34 | | defined(_MSC_VER) || defined(__BORLANDC__) || defined(__TURBOC__) |
35 | | #define get16bits(d) (*((const uint16_t*)(d))) |
36 | | #endif |
37 | | |
38 | | #if !defined(get16bits) |
39 | | #define get16bits(d) \ |
40 | 12.3k | ((((uint32_t)(((const uint8_t*)(d))[1])) << 8) + \ |
41 | 12.3k | (uint32_t)(((const uint8_t*)(d))[0])) |
42 | | #endif |
43 | | |
44 | 3.12k | uint32_t SuperFastHash(const char* data, int len, uint32_t hash) { |
45 | 3.12k | uint32_t tmp; |
46 | 3.12k | int rem; |
47 | | |
48 | 3.12k | if (len <= 0 || data == NULL) { |
49 | 1.33k | return 0; |
50 | 1.33k | } |
51 | | |
52 | 1.79k | rem = len & 3; |
53 | 1.79k | len >>= 2; |
54 | | |
55 | | // Main loop |
56 | 7.99k | for (; len > 0; len--) { |
57 | 6.19k | hash += get16bits(data); |
58 | 6.19k | tmp = (uint32_t)(get16bits(data + 2) << 11) ^ hash; |
59 | 6.19k | hash = (hash << 16) ^ tmp; |
60 | 6.19k | data += 2 * sizeof(uint16_t); |
61 | 6.19k | hash += hash >> 11; |
62 | 6.19k | } |
63 | | |
64 | | // Handle end cases |
65 | 1.79k | switch (rem) { |
66 | 0 | case 3: |
67 | 0 | hash += get16bits(data); |
68 | 0 | hash ^= hash << 16; |
69 | 0 | hash ^= (uint32_t)(((signed char)data[sizeof(uint16_t)]) << 18); |
70 | 0 | hash += hash >> 11; |
71 | 0 | break; |
72 | 0 | case 2: |
73 | 0 | hash += get16bits(data); |
74 | 0 | hash ^= hash << 11; |
75 | 0 | hash += hash >> 17; |
76 | 0 | break; |
77 | 1.40k | case 1: |
78 | 1.40k | hash += (uint32_t)((signed char)*data); |
79 | 1.40k | hash ^= hash << 10; |
80 | 1.40k | hash += hash >> 1; |
81 | 1.79k | } |
82 | | |
83 | | // Force "avalanching" of final 127 bits |
84 | 1.79k | hash ^= hash << 3; |
85 | 1.79k | hash += hash >> 5; |
86 | 1.79k | hash ^= hash << 4; |
87 | 1.79k | hash += hash >> 17; |
88 | 1.79k | hash ^= hash << 25; |
89 | 1.79k | hash += hash >> 6; |
90 | | |
91 | 1.79k | return hash; |
92 | 1.79k | } |