src/hash_key.c

Sun, 22 Dec 2024 22:10:04 +0100

author
Mike Becker <universe@uap-core.de>
date
Sun, 22 Dec 2024 22:10:04 +0100
changeset 1047
40aad3f0bc9e
parent 949
c2ba65ea8d31
permissions
-rw-r--r--

don't trust that size_t always has word width

it should be the case on all platforms supported by UCX, but it's not strictly defined in POSIX that it must be the case

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 #include "cx/hash_key.h"
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 #include <string.h>
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 void cx_hash_murmur(CxHashKey *key) {
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 690
diff changeset
33 const unsigned char *data = key->data;
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
34 if (data == NULL) {
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 604
diff changeset
35 // extension: special value for NULL
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
36 key->hash = 1574210520u;
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
37 return;
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
38 }
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 size_t len = key->len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 unsigned m = 0x5bd1e995;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42 unsigned r = 24;
949
c2ba65ea8d31 add cast from size_t to unsigned to avoid warnings from certain compilers
Mike Becker <universe@uap-core.de>
parents: 890
diff changeset
43 unsigned h = 25 ^ (unsigned) len;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 unsigned i = 0;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 while (len >= 4) {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 unsigned k = data[i + 0] & 0xFF;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
47 k |= (data[i + 1] & 0xFF) << 8;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 k |= (data[i + 2] & 0xFF) << 16;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49 k |= (data[i + 3] & 0xFF) << 24;
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 k *= m;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 k ^= k >> r;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 k *= m;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 h *= m;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 h ^= k;
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 i += 4;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 len -= 4;
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
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 switch (len) {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 case 3:
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 h ^= (data[i + 2] & 0xFF) << 16;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 __attribute__((__fallthrough__));
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 case 2:
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 h ^= (data[i + 1] & 0xFF) << 8;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 __attribute__((__fallthrough__));
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 case 1:
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 h ^= (data[i + 0] & 0xFF);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 h *= m;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 __attribute__((__fallthrough__));
628
1e2be40f0cb5 use //-style single line comments everywhere
Mike Becker <universe@uap-core.de>
parents: 604
diff changeset
73 default: // do nothing
678
78f943d76f50 reformat code
Mike Becker <universe@uap-core.de>
parents: 628
diff changeset
74 ;
563
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
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 h ^= h >> 13;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 h *= m;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 h ^= h >> 15;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 key->hash = h;
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
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 690
diff changeset
84 CxHashKey cx_hash_key_str(const char *str) {
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 CxHashKey key;
690
2c2304622981 simplify CxHashKey
Mike Becker <universe@uap-core.de>
parents: 678
diff changeset
86 key.data = str;
604
056e5f592d84 change hash functions
Mike Becker <universe@uap-core.de>
parents: 603
diff changeset
87 key.len = str == NULL ? 0 : strlen(str);
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 cx_hash_murmur(&key);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
89 return key;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 }
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 CxHashKey cx_hash_key_bytes(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 690
diff changeset
93 const unsigned char *bytes,
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 size_t len
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 CxHashKey key;
690
2c2304622981 simplify CxHashKey
Mike Becker <universe@uap-core.de>
parents: 678
diff changeset
97 key.data = bytes;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
98 key.len = len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
99 cx_hash_murmur(&key);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
100 return key;
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
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
103 CxHashKey cx_hash_key(
890
54565fd74e74 move all const keywords to the west - fixes #426
Mike Becker <universe@uap-core.de>
parents: 690
diff changeset
104 const void *obj,
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
105 size_t len
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
106 ) {
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
107 CxHashKey key;
690
2c2304622981 simplify CxHashKey
Mike Becker <universe@uap-core.de>
parents: 678
diff changeset
108 key.data = obj;
563
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 key.len = len;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 cx_hash_murmur(&key);
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
111 return key;
69a83fad8a35 improve hash key handling
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 }

mercurial