Line |
Branch |
Exec |
Source |
1 |
|
|
/* |
2 |
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
3 |
|
|
* |
4 |
|
|
* Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved. |
5 |
|
|
* |
6 |
|
|
* Redistribution and use in source and binary forms, with or without |
7 |
|
|
* modification, are permitted provided that the following conditions are met: |
8 |
|
|
* |
9 |
|
|
* 1. Redistributions of source code must retain the above copyright |
10 |
|
|
* notice, this list of conditions and the following disclaimer. |
11 |
|
|
* |
12 |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
13 |
|
|
* notice, this list of conditions and the following disclaimer in the |
14 |
|
|
* documentation and/or other materials provided with the distribution. |
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 HOLDER 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 |
|
|
* @file hash_key.h |
30 |
|
|
* @brief Interface for map implementations. |
31 |
|
|
* @author Mike Becker |
32 |
|
|
* @author Olaf Wintermann |
33 |
|
|
* @copyright 2-Clause BSD License |
34 |
|
|
*/ |
35 |
|
|
|
36 |
|
|
|
37 |
|
|
#ifndef UCX_HASH_KEY_H |
38 |
|
|
#define UCX_HASH_KEY_H |
39 |
|
|
|
40 |
|
|
#include "common.h" |
41 |
|
|
#include "string.h" |
42 |
|
|
|
43 |
|
|
#ifdef __cplusplus |
44 |
|
|
extern "C" { |
45 |
|
|
#endif |
46 |
|
|
|
47 |
|
|
/** Internal structure for a key within a hash map. */ |
48 |
|
|
struct cx_hash_key_s { |
49 |
|
|
/** The key data. */ |
50 |
|
|
const void *data; |
51 |
|
|
/** |
52 |
|
|
* The key data length. |
53 |
|
|
*/ |
54 |
|
|
size_t len; |
55 |
|
|
/** The hash value of the key data. */ |
56 |
|
|
unsigned hash; |
57 |
|
|
}; |
58 |
|
|
|
59 |
|
|
/** |
60 |
|
|
* Type for a hash key. |
61 |
|
|
*/ |
62 |
|
|
typedef struct cx_hash_key_s CxHashKey; |
63 |
|
|
|
64 |
|
|
/** |
65 |
|
|
* Computes a murmur2 32-bit hash. |
66 |
|
|
* |
67 |
|
|
* You need to initialize @c data and @c len in the key struct. |
68 |
|
|
* The hash is then directly written to that struct. |
69 |
|
|
* |
70 |
|
|
* Usually you should not need this function. |
71 |
|
|
* Use cx_hash_key(), instead. |
72 |
|
|
* |
73 |
|
|
* @note If @c data is @c NULL, the hash is defined as 1574210520. |
74 |
|
|
* |
75 |
|
|
* @param key the key, the hash shall be computed for |
76 |
|
|
* @see cx_hash_key() |
77 |
|
|
*/ |
78 |
|
|
cx_attr_nonnull |
79 |
|
|
cx_attr_export |
80 |
|
|
void cx_hash_murmur(CxHashKey *key); |
81 |
|
|
|
82 |
|
|
/** |
83 |
|
|
* Computes a hash key from a string. |
84 |
|
|
* |
85 |
|
|
* The string needs to be zero-terminated. |
86 |
|
|
* |
87 |
|
|
* @param str the string |
88 |
|
|
* @return the hash key |
89 |
|
|
*/ |
90 |
|
|
cx_attr_nodiscard |
91 |
|
|
cx_attr_cstr_arg(1) |
92 |
|
|
cx_attr_export |
93 |
|
|
CxHashKey cx_hash_key_str(const char *str); |
94 |
|
|
|
95 |
|
|
/** |
96 |
|
|
* Computes a hash key from a byte array. |
97 |
|
|
* |
98 |
|
|
* @param bytes the array |
99 |
|
|
* @param len the length |
100 |
|
|
* @return the hash key |
101 |
|
|
*/ |
102 |
|
|
cx_attr_nodiscard |
103 |
|
|
cx_attr_access_r(1, 2) |
104 |
|
|
cx_attr_export |
105 |
|
|
CxHashKey cx_hash_key_bytes( |
106 |
|
|
const unsigned char *bytes, |
107 |
|
|
size_t len |
108 |
|
|
); |
109 |
|
|
|
110 |
|
|
/** |
111 |
|
|
* Computes a hash key for an arbitrary object. |
112 |
|
|
* |
113 |
|
|
* The computation uses the in-memory representation that might not be |
114 |
|
|
* the same on different platforms. Therefore, this hash should not be |
115 |
|
|
* used for data exchange with different machines. |
116 |
|
|
* |
117 |
|
|
* @param obj a pointer to an arbitrary object |
118 |
|
|
* @param len the length of object in memory |
119 |
|
|
* @return the hash key |
120 |
|
|
*/ |
121 |
|
|
cx_attr_nodiscard |
122 |
|
|
cx_attr_access_r(1, 2) |
123 |
|
|
cx_attr_export |
124 |
|
|
CxHashKey cx_hash_key( |
125 |
|
|
const void *obj, |
126 |
|
|
size_t len |
127 |
|
|
); |
128 |
|
|
|
129 |
|
|
/** |
130 |
|
|
* Computes a hash key from a UCX string. |
131 |
|
|
* |
132 |
|
|
* @param str the string |
133 |
|
|
* @return the hash key |
134 |
|
|
*/ |
135 |
|
|
cx_attr_nodiscard |
136 |
|
12 |
static inline CxHashKey cx_hash_key_cxstr(cxstring str) { |
137 |
|
12 |
return cx_hash_key(str.ptr, str.length); |
138 |
|
|
} |
139 |
|
|
|
140 |
|
|
/** |
141 |
|
|
* Computes a hash key from a UCX string. |
142 |
|
|
* |
143 |
|
|
* @param str (@c cxstring or @c cxmutstr) the string |
144 |
|
|
* @return (@c CxHashKey) the hash key |
145 |
|
|
*/ |
146 |
|
|
#define cx_hash_key_cxstr(str) cx_hash_key_cxstr(cx_strcast(str)) |
147 |
|
|
|
148 |
|
|
#ifdef __cplusplus |
149 |
|
|
} // extern "C" |
150 |
|
|
#endif |
151 |
|
|
|
152 |
|
|
#endif // UCX_HASH_KEY_H |
153 |
|
|
|