UNIXworkcode

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 * \version 3.0 34 * \copyright 2-Clause BSD License 35 */ 36 37 38 #ifndef UCX_HASH_KEY_H 39 #define UCX_HASH_KEY_H 40 41 #include "common.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 void const *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 * \note If \c data is \c NULL, the hash is defined as 1574210520. 71 * 72 * @param key the key, the hash shall be computed for 73 */ 74 void cx_hash_murmur(CxHashKey *key); 75 76 /** 77 * Computes a hash key from a string. 78 * 79 * The string needs to be zero-terminated. 80 * 81 * @param str the string 82 * @return the hash key 83 */ 84 __attribute__((__warn_unused_result__)) 85 CxHashKey cx_hash_key_str(char const *str); 86 87 /** 88 * Computes a hash key from a byte array. 89 * 90 * @param bytes the array 91 * @param len the length 92 * @return the hash key 93 */ 94 __attribute__((__warn_unused_result__)) 95 CxHashKey cx_hash_key_bytes( 96 unsigned char const *bytes, 97 size_t len 98 ); 99 100 /** 101 * Computes a hash key for an arbitrary object. 102 * 103 * The computation uses the in-memory representation that might not be 104 * the same on different platforms. Therefore, this hash should not be 105 * used for data exchange with different machines. 106 * 107 * @param obj a pointer to an arbitrary object 108 * @param len the length of object in memory 109 * @return the hash key 110 */ 111 __attribute__((__warn_unused_result__)) 112 CxHashKey cx_hash_key( 113 void const *obj, 114 size_t len 115 ); 116 117 /** 118 * Computes a hash key from a UCX string. 119 * 120 * @param str the string 121 * @return the hash key 122 */ 123 #define cx_hash_key_cxstr(str) cx_hash_key((void*)(str).ptr, (str).length) 124 125 #ifdef __cplusplus 126 } // extern "C" 127 #endif 128 129 #endif // UCX_HASH_KEY_H 130