LAMMP
4.1.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
xxhash.c
浏览该文件的文档.
1
/*
2
* LAMMP - Copyright (C) 2025-2026 HJimmyK(Jericho Knox)
3
* This file is part of lammp, under the GNU LGPL v2 license.
4
* See LICENSE in the project root for the full license text.
5
*/
6
7
#include "../../../include/lammp/secret.h"
8
9
#define PRIME64_1 0x9E3779B185EBCA87ULL
10
#define PRIME64_2 0xC2B2AE3D27D4EB4FULL
11
#define PRIME64_3 0x165667B19E3779F9ULL
12
#define PRIME64_4 0x85EBCA77C2B2AE63ULL
13
#define PRIME64_5 0x27D4EB2F165667C5ULL
14
15
static
inline
uint64_t
rotl64
(uint64_t x,
int
b) {
16
b &= 63;
17
return
(x << b) | (x >> (64 - b));
18
}
19
20
uint64_t
lmmp_xxhash_
(
mp_srcptr
in,
mp_size_t
inlen,
srckey64_t
key) {
21
uint64_t seed = key == NULL ? 0 : key[0];
22
if
(in == NULL || inlen == 0) {
23
seed +=
PRIME64_5
;
24
seed += 0;
// len = 0
25
seed ^= seed >> 33;
26
seed *=
PRIME64_2
;
27
seed ^= seed >> 29;
28
seed *=
PRIME64_3
;
29
seed ^= seed >> 32;
30
return
seed;
31
}
32
33
const
uint64_t* p = in;
34
const
uint64_t*
const
end = in + inlen;
35
uint64_t h64;
36
37
if
(inlen >= 4) {
38
const
uint64_t*
const
limit = end - 4;
39
uint64_t
v1
= seed +
PRIME64_1
+
PRIME64_2
;
40
uint64_t
v2
= seed +
PRIME64_2
;
41
uint64_t v3 = seed + 0;
42
uint64_t v4 = seed -
PRIME64_1
;
43
44
do
{
45
v1
+= *p *
PRIME64_2
;
46
v1
=
rotl64
(
v1
, 31);
47
v1
*=
PRIME64_1
;
48
p++;
49
50
v2
+= *p *
PRIME64_2
;
51
v2
=
rotl64
(
v2
, 31);
52
v2
*=
PRIME64_1
;
53
p++;
54
55
v3 += *p *
PRIME64_2
;
56
v3 =
rotl64
(v3, 31);
57
v3 *=
PRIME64_1
;
58
p++;
59
60
v4 += *p *
PRIME64_2
;
61
v4 =
rotl64
(v4, 31);
62
v4 *=
PRIME64_1
;
63
p++;
64
}
while
(p <= limit);
65
66
h64 =
rotl64
(
v1
, 1) +
rotl64
(
v2
, 7) +
rotl64
(v3, 12) +
rotl64
(v4, 18);
67
68
v1
*=
PRIME64_2
;
69
v1
=
rotl64
(
v1
, 31);
70
v1
*=
PRIME64_1
;
71
h64 ^=
v1
;
72
h64 = h64 *
PRIME64_1
+
PRIME64_4
;
73
74
v2
*=
PRIME64_2
;
75
v2
=
rotl64
(
v2
, 31);
76
v2
*=
PRIME64_1
;
77
h64 ^=
v2
;
78
h64 = h64 *
PRIME64_1
+
PRIME64_4
;
79
80
v3 *=
PRIME64_2
;
81
v3 =
rotl64
(v3, 31);
82
v3 *=
PRIME64_1
;
83
h64 ^= v3;
84
h64 = h64 *
PRIME64_1
+
PRIME64_4
;
85
86
v4 *=
PRIME64_2
;
87
v4 =
rotl64
(v4, 31);
88
v4 *=
PRIME64_1
;
89
h64 ^= v4;
90
h64 = h64 *
PRIME64_1
+
PRIME64_4
;
91
}
else
{
92
h64 = seed +
PRIME64_5
;
93
}
94
95
h64 += (uint64_t)(inlen *
sizeof
(
mp_limb_t
));
96
97
while
(p < end) {
98
uint64_t k1 = *p;
99
k1 *=
PRIME64_2
;
100
k1 =
rotl64
(k1, 31);
101
k1 *=
PRIME64_1
;
102
h64 ^= k1;
103
h64 =
rotl64
(h64, 27) *
PRIME64_1
+
PRIME64_4
;
104
p++;
105
}
106
107
h64 ^= h64 >> 33;
108
h64 *=
PRIME64_2
;
109
h64 ^= h64 >> 29;
110
h64 *=
PRIME64_3
;
111
h64 ^= h64 >> 32;
112
113
return
h64;
114
}
mp_size_t
uint64_t mp_size_t
Definition
lmmp.h:212
mp_srcptr
const mp_limb_t * mp_srcptr
Definition
lmmp.h:216
mp_limb_t
uint64_t mp_limb_t
Definition
lmmp.h:211
v1
#define v1
v2
#define v2
srckey64_t
const uint64_t srckey64_t[1]
Definition
secret.h:111
lmmp_xxhash_
uint64_t lmmp_xxhash_(mp_srcptr in, mp_size_t inlen, srckey64_t key)
xxhash 函数(非标准处理任意字节流的 xxhash)
Definition
xxhash.c:20
PRIME64_4
#define PRIME64_4
Definition
xxhash.c:12
rotl64
static uint64_t rotl64(uint64_t x, int b)
Definition
xxhash.c:15
PRIME64_1
#define PRIME64_1
Definition
xxhash.c:9
PRIME64_5
#define PRIME64_5
Definition
xxhash.c:13
PRIME64_3
#define PRIME64_3
Definition
xxhash.c:11
PRIME64_2
#define PRIME64_2
Definition
xxhash.c:10
src
lammp
secret
xxhash.c
生成于 2026年 五月 24日 星期日 18:55:00 , 为 LAMMP使用
1.9.8