Nyx Node
Loading...
Searching...
No Matches
hash.c
1/* NyxNode
2 * Author: Jérôme ODIER <jerome.odier@lpsc.in2p3.fr>
3 * SPDX-License-Identifier: GPL-2.0-only (Mongoose backend) or GPL-3.0+
4 */
5
6/*--------------------------------------------------------------------------------------------------------------------*/
7
8#include <string.h>
9
10#include "../nyx_node_internal.h"
11
12/*--------------------------------------------------------------------------------------------------------------------*/
13
14static const uint32_t MURMUR2_MAGIC = 0x5BD1E995UL;
15
16/*--------------------------------------------------------------------------------------------------------------------*/
17
18uint32_t nyx_hash(size_t size, BUFF_t buff, uint32_t seed)
19{
20 if(size == 0x00
21 ||
22 buff == NULL
23 ) {
24 return seed;
25 }
26
27 uint32_t h = seed ^ (uint32_t) size;
28
29 /*----------------------------------------------------------------------------------------------------------------*/
30
31 const uint8_t *data = buff;
32
33 for(uint32_t k; size >= 4;)
34 {
35 memcpy(&k, data, sizeof(k));
36
37 k *= MURMUR2_MAGIC;
38 k ^= k >> 24;
39 k *= MURMUR2_MAGIC;
40
41 h *= MURMUR2_MAGIC;
42 h ^= k >> 0;
43
44 data += 4;
45 size -= 4;
46 }
47
48 /*----------------------------------------------------------------------------------------------------------------*/
49
50 switch(size)
51 {
52 case 3: h ^= ((uint32_t) data[2]) << 16; /* fallthrough */ /* NOSONAR */
53 case 2: h ^= ((uint32_t) data[1]) << 8; /* fallthrough */ /* NOSONAR */
54 case 1: h ^= ((uint32_t) data[0]) << 0; /* fallthrough */ /* NOSONAR */
55 h *= MURMUR2_MAGIC;
56 break;
57 default:
58 break;
59 }
60
61 /*----------------------------------------------------------------------------------------------------------------*/
62
63 h ^= h >> 13;
64 h *= MURMUR2_MAGIC;
65 h ^= h >> 15;
66
67 /*----------------------------------------------------------------------------------------------------------------*/
68
69 return h;
70}
71
72/*--------------------------------------------------------------------------------------------------------------------*/
#define BUFF_t
Alias for const void *.
Definition nyx_node.h:68
uint32_t nyx_hash(__NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff, uint32_t seed)
Hashes a buffer using the MurmurHash2 algorithm.