Nyx Node
Toggle main menu visibility
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
14
static
const
uint32_t MURMUR2_MAGIC = 0x5BD1E995UL;
15
16
/*--------------------------------------------------------------------------------------------------------------------*/
17
18
uint32_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
/*--------------------------------------------------------------------------------------------------------------------*/
BUFF_t
#define BUFF_t
Alias for const void *.
Definition
nyx_node.h:68
nyx_hash
uint32_t nyx_hash(__NYX_ZEROABLE__ size_t size, __NYX_NULLABLE__ BUFF_t buff, uint32_t seed)
Hashes a buffer using the MurmurHash2 algorithm.
Author:
Jérôme ODIER
License:
LGPL-3.0-or-later
Copyright:
LPSC / CNRS