src/cx/hash_key.h

Fri, 23 May 2025 12:44:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 23 May 2025 12:44:24 +0200
changeset 1327
ed75dc1db503
parent 1180
4c3a69b9723a
permissions
-rw-r--r--

make test-compile depend on both static and shared

the shared lib is not needed for the tests,
but when run with coverage, gcov will be confused
when outdated line information is available from
a previous shared build

563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 /**
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
29 * @file hash_key.h
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
30 * @brief Interface for map implementations.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
31 * @author Mike Becker
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
32 * @author Olaf Wintermann
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
33 * @copyright 2-Clause BSD License
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 #ifndef UCX_HASH_KEY_H
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 #define UCX_HASH_KEY_H
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39
681
502105523db7 fix common.h include problems - fixes #255
Mike Becker <universe@uap-core.de>
parents: 663
diff changeset
40 #include "common.h"
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
41 #include "string.h"
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 #ifdef __cplusplus
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 extern "C" {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 /** Internal structure for a key within a hash map. */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 struct cx_hash_key_s {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 /** The key data. */
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
50 const void *data;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 * The key data length.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 size_t len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 /** The hash value of the key data. */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 unsigned hash;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 };
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 * Type for a hash key.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 typedef struct cx_hash_key_s CxHashKey;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 /**
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
65 * Computes a murmur2 32-bit hash.
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 *
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
67 * You need to initialize @c data and @c len in the key struct.
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 * The hash is then directly written to that struct.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 *
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
70 * Usually you should not need this function.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
71 * Use cx_hash_key(), instead.
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
72 *
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
73 * @note If @c data is @c NULL, the hash is defined as 1574210520.
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
74 *
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 * @param key the key, the hash shall be computed for
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
76 * @see cx_hash_key()
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
78 cx_attr_nonnull
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1094
diff changeset
79 cx_attr_export
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 void cx_hash_murmur(CxHashKey *key);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83 * Computes a hash key from a string.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 * The string needs to be zero-terminated.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 * @param str the string
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
90 cx_attr_nodiscard
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
91 cx_attr_cstr_arg(1)
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1094
diff changeset
92 cx_attr_export
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
93 CxHashKey cx_hash_key_str(const char *str);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 * Computes a hash key from a byte array.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
97 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 * @param bytes the array
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 * @param len the length
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
102 cx_attr_nodiscard
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
103 cx_attr_access_r(1, 2)
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1094
diff changeset
104 cx_attr_export
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 CxHashKey cx_hash_key_bytes(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
106 const unsigned char *bytes,
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 size_t len
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 );
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 * Computes a hash key for an arbitrary object.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 * The computation uses the in-memory representation that might not be
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 * the same on different platforms. Therefore, this hash should not be
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 * used for data exchange with different machines.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
117 * @param obj a pointer to an arbitrary object
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
118 * @param len the length of object in memory
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 */
985
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
121 cx_attr_nodiscard
68754c7de906 major refactoring of attributes
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
122 cx_attr_access_r(1, 2)
1180
4c3a69b9723a add support for building windows DLLs - resolves #582
Mike Becker <universe@uap-core.de>
parents: 1094
diff changeset
123 cx_attr_export
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 CxHashKey cx_hash_key(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 759
diff changeset
125 const void *obj,
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 size_t len
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 );
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128
663
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
129 /**
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
130 * Computes a hash key from a UCX string.
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
131 *
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
132 * @param str the string
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
133 * @return the hash key
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
134 */
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
135 cx_attr_nodiscard
1050
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
136 static inline CxHashKey cx_hash_key_cxstr(cxstring str) {
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
137 return cx_hash_key(str.ptr, str.length);
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
138 }
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
139
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
140 /**
1050
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
141 * Computes a hash key from a UCX string.
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
142 *
1094
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
143 * @param str (@c cxstring or @c cxmutstr) the string
aea6f31a82d7 refine docs for hash_key.h - issue #548
Mike Becker <universe@uap-core.de>
parents: 1050
diff changeset
144 * @return (@c CxHashKey) the hash key
1049
415bf2ce6bab fix cx_hash_key_cxstr() being a macro
Mike Becker <universe@uap-core.de>
parents: 985
diff changeset
145 */
1050
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
146 #define cx_hash_key_cxstr(str) cx_hash_key_cxstr(cx_strcast(str))
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
147
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
148 #ifdef __cplusplus
3df63e95921a make cx_strcast() also support cxstring
Mike Becker <universe@uap-core.de>
parents: 1049
diff changeset
149 } // extern "C"
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
151
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 604
diff changeset
152 #endif // UCX_HASH_KEY_H

mercurial