src/cx/hash_key.h

Sun, 14 Jan 2024 13:50:17 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 14 Jan 2024 13:50:17 +0100
changeset 806
e06249e09f99
parent 759
475335643af4
child 890
54565fd74e74
permissions
-rw-r--r--

add constant for reading out strstr sbo size - relates to #343

also fixes the related test which was working with the old SBO size of 256 and was broken after increasing it to 512

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 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 * \file hash_key.h
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 * \brief Interface for map implementations.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 * \author Mike Becker
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 * \author Olaf Wintermann
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 * \copyright 2-Clause BSD License
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"
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 #ifdef __cplusplus
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 extern "C" {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 /** Internal structure for a key within a hash map. */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 struct cx_hash_key_s {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 /** The key data. */
690
2c2304622981 simplify CxHashKey
Mike Becker <universe@uap-core.de>
parents: 681
diff changeset
49 void const *data;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
50 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 * The key data length.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 size_t len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 /** The hash value of the key data. */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 unsigned hash;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 };
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 * Type for a hash key.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 typedef struct cx_hash_key_s CxHashKey;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 /**
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
64 * Computes a murmur2 32 bit hash.
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 *
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
66 * 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
67 * The hash is then directly written to that struct.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 *
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
69 * \note If \c data is \c NULL, the hash is defined as 1574210520.
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
70 *
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 * @param key the key, the hash shall be computed for
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 void cx_hash_murmur(CxHashKey *key);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 * Computes a hash key from a string.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 * The string needs to be zero-terminated.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 * @param str the string
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 * @return the hash key
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 __attribute__((__warn_unused_result__))
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 CxHashKey cx_hash_key_str(char const *str);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85
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 * Computes a hash key from a byte array.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 * @param bytes the array
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 * @param len the length
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91 * @return the hash key
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 */
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 __attribute__((__warn_unused_result__))
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 CxHashKey cx_hash_key_bytes(
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 unsigned char const *bytes,
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
96 size_t len
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
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 /**
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 * Computes a hash key for an arbitrary object.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
101 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
102 * 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
103 * 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
104 * used for data exchange with different machines.
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 *
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 * @param obj a pointer to an arbitrary object
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 * @param len the length of object in memory
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
108 * @return the hash key
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 __attribute__((__warn_unused_result__))
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 CxHashKey cx_hash_key(
603
c49104015a6b fix missing const in cx_hash_key signature
Mike Becker <universe@uap-core.de>
parents: 563
diff changeset
112 void const *obj,
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 size_t len
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 );
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115
663
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
116 /**
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
117 * 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
118 *
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
119 * @param str the string
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
120 * @return the hash key
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
121 */
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
122 #define cx_hash_key_cxstr(str) cx_hash_key((void*)(str).ptr, (str).length)
d50b5dc1e058 add cx_hash_key_cxstr() macro
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
123
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 #ifdef __cplusplus
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 } // extern "C"
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 #endif
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 604
diff changeset
128 #endif // UCX_HASH_KEY_H

mercurial