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
15static inline uint64_t rotl64(uint64_t x, int b) {
16 b &= 63;
17 return (x << b) | (x >> (64 - b));
18}
19
20uint64_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}
uint64_t mp_size_t
Definition lmmp.h:212
const mp_limb_t * mp_srcptr
Definition lmmp.h:216
uint64_t mp_limb_t
Definition lmmp.h:211
#define v1
#define v2
const uint64_t srckey64_t[1]
Definition secret.h:111
uint64_t lmmp_xxhash_(mp_srcptr in, mp_size_t inlen, srckey64_t key)
xxhash 函数(非标准处理任意字节流的 xxhash)
Definition xxhash.c:20
#define PRIME64_4
Definition xxhash.c:12
static uint64_t rotl64(uint64_t x, int b)
Definition xxhash.c:15
#define PRIME64_1
Definition xxhash.c:9
#define PRIME64_5
Definition xxhash.c:13
#define PRIME64_3
Definition xxhash.c:11
#define PRIME64_2
Definition xxhash.c:10