LAMMP 4.1.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)
 

宏定义说明

◆ 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
static uint64_t rotl64(uint64_t x, int b)
Definition siphash.c:9

函数说明

◆ 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.c14 行定义.

14 {
15#define SIPROUND \
16 do { \
17 v0 += v1; \
18 v1 = rotl64(v1, 13); \
19 v1 ^= v0; \
20 v0 = rotl64(v0, 32); \
21 v2 += v3; \
22 v3 = rotl64(v3, 16); \
23 v3 ^= v2; \
24 v0 += v3; \
25 v3 = rotl64(v3, 21); \
26 v3 ^= v0; \
27 v2 += v1; \
28 v1 = rotl64(v1, 17); \
29 v1 ^= v2; \
30 v2 = rotl64(v2, 32); \
31 } while (0)
32
33 uint64_t k0;
34 uint64_t k1;
35 if (key == NULL) {
36 k0 = 0;
37 k1 = 0;
38 } else {
39 k0 = key[0];
40 k1 = key[1];
41 }
42
43 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
44 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
45 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
46 uint64_t v3 = 0x7465646279746573ULL ^ k1;
47
48 const uint64_t* data = (const uint64_t*)in;
49 const uint64_t* end = data + inlen;
50
51 const uint64_t* limit = data + (inlen & ~3ULL);
52
53 while (data < limit) {
54 uint64_t m0 = data[0];
55 uint64_t m1 = data[1];
56 uint64_t m2 = data[2];
57 uint64_t m3 = data[3];
58 data += 4;
59
60 v3 ^= m0;
63 v0 ^= m0;
64
65 v3 ^= m1;
68 v0 ^= m1;
69
70 v3 ^= m2;
73 v0 ^= m2;
74
75 v3 ^= m3;
78 v0 ^= m3;
79 }
80
81 while (data < end) {
82 uint64_t m = *data++;
83 v3 ^= m;
86 v0 ^= m;
87 }
88
89 uint64_t b = ((uint64_t)(inlen * LIMB_BYTES)) << 56;
90 v3 ^= b;
93 v0 ^= b;
94
95 v2 ^= 0xff;
100
101 return v0 ^ v1 ^ v2 ^ v3;
102}
#define LIMB_BYTES
Definition mparam.h:85
#define SIPROUND

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

◆ rotl64()

static uint64_t rotl64 ( uint64_t  x,
int  b 
)
inlinestatic

在文件 siphash.c9 行定义.

9 {
10 b &= 63;
11 return (x << b) | (x >> (64 - b));
12}