LAMMP 4.2.0
Lamina High-Precision Arithmetic Library
载入中...
搜索中...
未找到
siphash.c 文件参考
+ siphash.c 的引用(Include)关系图:

浏览源代码.

宏定义

#define SIPROUND
 

函数

uint64_t lmmp_siphash24_ (mp_srcptr in, mp_size_t inlen, srckey128_t key)
 SipHash-2-4 函数(非标准处理任意字节流的 SipHash-2-4)
 
static uint64_t rotl64 (uint64_t x, int b)
 Copyright (C) 2026 HJimmyK(Jericho Knox)
 

宏定义说明

◆ SIPROUND

#define SIPROUND
值:
do { \
v0 += v1; \
v1 = rotl64(v1, 13); \
v1 ^= v0; \
v0 = rotl64(v0, 32); \
v2 += v3; \
v3 = rotl64(v3, 16); \
v3 ^= v2; \
v0 += v3; \
v3 = rotl64(v3, 21); \
v3 ^= v0; \
v2 += v1; \
v1 = rotl64(v1, 17); \
v1 ^= v2; \
v2 = rotl64(v2, 32); \
} while (0)
#define v0
#define v1
#define v2
#define n
static uint64_t rotl64(uint64_t x, int b)
Copyright (C) 2026 HJimmyK(Jericho Knox)
Definition siphash.c:18

函数说明

◆ lmmp_siphash24_()

uint64_t lmmp_siphash24_ ( mp_srcptr  in,
mp_size_t  inlen,
srckey128_t  key 
)

SipHash-2-4 函数(非标准处理任意字节流的 SipHash-2-4)

参数
in输入数据,可以为 NULL
inlen输入数据长度
key128-bit 秘钥,可以为 NULL
警告
若 key 为 NULL,则使用全零秘钥
返回
64-bit hash 值

在文件 siphash.c23 行定义.

23 {
24#define SIPROUND \
25 do { \
26 v0 += v1; \
27 v1 = rotl64(v1, 13); \
28 v1 ^= v0; \
29 v0 = rotl64(v0, 32); \
30 v2 += v3; \
31 v3 = rotl64(v3, 16); \
32 v3 ^= v2; \
33 v0 += v3; \
34 v3 = rotl64(v3, 21); \
35 v3 ^= v0; \
36 v2 += v1; \
37 v1 = rotl64(v1, 17); \
38 v1 ^= v2; \
39 v2 = rotl64(v2, 32); \
40 } while (0)
41
42 uint64_t k0;
43 uint64_t k1;
44 if (key == NULL) {
45 k0 = 0;
46 k1 = 0;
47 } else {
48 k0 = key[0];
49 k1 = key[1];
50 }
51
52 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
53 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
54 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
55 uint64_t v3 = 0x7465646279746573ULL ^ k1;
56
57 const uint64_t* data = (const uint64_t*)in;
58 const uint64_t* end = data + inlen;
59
60 const uint64_t* limit = data + (inlen & ~3ULL);
61
62 while (data < limit) {
63 uint64_t m0 = data[0];
64 uint64_t m1 = data[1];
65 uint64_t m2 = data[2];
66 uint64_t m3 = data[3];
67 data += 4;
68
69 v3 ^= m0;
72 v0 ^= m0;
73
74 v3 ^= m1;
77 v0 ^= m1;
78
79 v3 ^= m2;
82 v0 ^= m2;
83
84 v3 ^= m3;
87 v0 ^= m3;
88 }
89
90 while (data < end) {
91 uint64_t m = *data++;
92 v3 ^= m;
95 v0 ^= m;
96 }
97
98 uint64_t b = ((uint64_t)(inlen * LIMB_BYTES)) << 56;
99 v3 ^= b;
100 SIPROUND;
101 SIPROUND;
102 v0 ^= b;
103
104 v2 ^= 0xff;
105 SIPROUND;
106 SIPROUND;
107 SIPROUND;
108 SIPROUND;
109
110 return v0 ^ v1 ^ v2 ^ v3;
111}
#define LIMB_BYTES
Definition mparam.h:85
#define SIPROUND

引用了 LIMB_BYTES, n, SIPROUND, v0, v1 , 以及 v2.

◆ rotl64()

static uint64_t rotl64 ( uint64_t  x,
int  b 
)
inlinestatic

Copyright (C) 2026 HJimmyK(Jericho Knox)

This file is part of LAMMP.

LAMMP is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.

This program is distributed WITHOUT ANY WARRANTY.

See https://www.gnu.org/licenses/.

在文件 siphash.c18 行定义.

18 {
19 b &= 63;
20 return (x << b) | (x >> (64 - b));
21}

引用了 n.