/Users/brunogarcia/projects/bitcoin-core-dev/src/crypto/siphash.cpp
Line | Count | Source |
1 | | // Copyright (c) 2016-present The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or http://www.opensource.org/licenses/mit-license.php. |
4 | | |
5 | | #include <crypto/siphash.h> |
6 | | |
7 | | #include <uint256.h> |
8 | | |
9 | | #include <bit> |
10 | | #include <cassert> |
11 | | #include <span> |
12 | | |
13 | 5.73M | #define SIPROUND do { \ |
14 | 5.73M | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ |
15 | 5.73M | v0 = std::rotl(v0, 32); \ |
16 | 5.73M | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ |
17 | 5.73M | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ |
18 | 5.73M | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ |
19 | 5.73M | v2 = std::rotl(v2, 32); \ |
20 | 5.73M | } while (0) |
21 | | |
22 | | CSipHasher::CSipHasher(uint64_t k0, uint64_t k1) |
23 | 118k | { |
24 | 118k | v[0] = 0x736f6d6570736575ULL ^ k0; |
25 | 118k | v[1] = 0x646f72616e646f6dULL ^ k1; |
26 | 118k | v[2] = 0x6c7967656e657261ULL ^ k0; |
27 | 118k | v[3] = 0x7465646279746573ULL ^ k1; |
28 | 118k | count = 0; |
29 | 118k | tmp = 0; |
30 | 118k | } |
31 | | |
32 | | CSipHasher& CSipHasher::Write(uint64_t data) |
33 | 0 | { |
34 | 0 | uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; |
35 | |
|
36 | 0 | assert(count % 8 == 0); |
37 | | |
38 | 0 | v3 ^= data; |
39 | 0 | SIPROUND; Line | Count | Source | 13 | 0 | #define SIPROUND do { \ | 14 | 0 | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 0 | v0 = std::rotl(v0, 32); \ | 16 | 0 | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 0 | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 0 | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 0 | v2 = std::rotl(v2, 32); \ | 20 | 0 | } while (0) |
|
40 | 0 | SIPROUND; Line | Count | Source | 13 | 0 | #define SIPROUND do { \ | 14 | 0 | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 0 | v0 = std::rotl(v0, 32); \ | 16 | 0 | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 0 | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 0 | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 0 | v2 = std::rotl(v2, 32); \ | 20 | 0 | } while (0) |
|
41 | 0 | v0 ^= data; |
42 | |
|
43 | 0 | v[0] = v0; |
44 | 0 | v[1] = v1; |
45 | 0 | v[2] = v2; |
46 | 0 | v[3] = v3; |
47 | |
|
48 | 0 | count += 8; |
49 | 0 | return *this; |
50 | 0 | } |
51 | | |
52 | | CSipHasher& CSipHasher::Write(std::span<const unsigned char> data) |
53 | 118k | { |
54 | 118k | uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; |
55 | 118k | uint64_t t = tmp; |
56 | 118k | uint8_t c = count; |
57 | | |
58 | 3.05M | while (data.size() > 0) { |
59 | 2.93M | t |= uint64_t{data.front()} << (8 * (c % 8)); |
60 | 2.93M | c++; |
61 | 2.93M | if ((c & 7) == 0) { |
62 | 313k | v3 ^= t; |
63 | 313k | SIPROUND; Line | Count | Source | 13 | 313k | #define SIPROUND do { \ | 14 | 313k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 313k | v0 = std::rotl(v0, 32); \ | 16 | 313k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 313k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 313k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 313k | v2 = std::rotl(v2, 32); \ | 20 | 313k | } while (0) |
|
64 | 313k | SIPROUND; Line | Count | Source | 13 | 313k | #define SIPROUND do { \ | 14 | 313k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 313k | v0 = std::rotl(v0, 32); \ | 16 | 313k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 313k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 313k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 313k | v2 = std::rotl(v2, 32); \ | 20 | 313k | } while (0) |
|
65 | 313k | v0 ^= t; |
66 | 313k | t = 0; |
67 | 313k | } |
68 | 2.93M | data = data.subspan(1); |
69 | 2.93M | } |
70 | | |
71 | 118k | v[0] = v0; |
72 | 118k | v[1] = v1; |
73 | 118k | v[2] = v2; |
74 | 118k | v[3] = v3; |
75 | 118k | count = c; |
76 | 118k | tmp = t; |
77 | | |
78 | 118k | return *this; |
79 | 118k | } |
80 | | |
81 | | uint64_t CSipHasher::Finalize() const |
82 | 118k | { |
83 | 118k | uint64_t v0 = v[0], v1 = v[1], v2 = v[2], v3 = v[3]; |
84 | | |
85 | 118k | uint64_t t = tmp | (((uint64_t)count) << 56); |
86 | | |
87 | 118k | v3 ^= t; |
88 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
89 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
90 | 118k | v0 ^= t; |
91 | 118k | v2 ^= 0xFF; |
92 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
93 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
94 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
95 | 118k | SIPROUND; Line | Count | Source | 13 | 118k | #define SIPROUND do { \ | 14 | 118k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 118k | v0 = std::rotl(v0, 32); \ | 16 | 118k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 118k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 118k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 118k | v2 = std::rotl(v2, 32); \ | 20 | 118k | } while (0) |
|
96 | 118k | return v0 ^ v1 ^ v2 ^ v3; |
97 | 118k | } |
98 | | |
99 | | uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val) |
100 | 213k | { |
101 | | /* Specialized implementation for efficiency */ |
102 | 213k | uint64_t d = val.GetUint64(0); |
103 | | |
104 | 213k | uint64_t v0 = 0x736f6d6570736575ULL ^ k0; |
105 | 213k | uint64_t v1 = 0x646f72616e646f6dULL ^ k1; |
106 | 213k | uint64_t v2 = 0x6c7967656e657261ULL ^ k0; |
107 | 213k | uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; |
108 | | |
109 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
110 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
111 | 213k | v0 ^= d; |
112 | 213k | d = val.GetUint64(1); |
113 | 213k | v3 ^= d; |
114 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
115 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
116 | 213k | v0 ^= d; |
117 | 213k | d = val.GetUint64(2); |
118 | 213k | v3 ^= d; |
119 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
120 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
121 | 213k | v0 ^= d; |
122 | 213k | d = val.GetUint64(3); |
123 | 213k | v3 ^= d; |
124 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
125 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
126 | 213k | v0 ^= d; |
127 | 213k | v3 ^= (uint64_t{4}) << 59; |
128 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
129 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
130 | 213k | v0 ^= (uint64_t{4}) << 59; |
131 | 213k | v2 ^= 0xFF; |
132 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
133 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
134 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
135 | 213k | SIPROUND; Line | Count | Source | 13 | 213k | #define SIPROUND do { \ | 14 | 213k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 213k | v0 = std::rotl(v0, 32); \ | 16 | 213k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 213k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 213k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 213k | v2 = std::rotl(v2, 32); \ | 20 | 213k | } while (0) |
|
136 | 213k | return v0 ^ v1 ^ v2 ^ v3; |
137 | 213k | } |
138 | | |
139 | | uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra) |
140 | 100k | { |
141 | | /* Specialized implementation for efficiency */ |
142 | 100k | uint64_t d = val.GetUint64(0); |
143 | | |
144 | 100k | uint64_t v0 = 0x736f6d6570736575ULL ^ k0; |
145 | 100k | uint64_t v1 = 0x646f72616e646f6dULL ^ k1; |
146 | 100k | uint64_t v2 = 0x6c7967656e657261ULL ^ k0; |
147 | 100k | uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d; |
148 | | |
149 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
150 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
151 | 100k | v0 ^= d; |
152 | 100k | d = val.GetUint64(1); |
153 | 100k | v3 ^= d; |
154 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
155 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
156 | 100k | v0 ^= d; |
157 | 100k | d = val.GetUint64(2); |
158 | 100k | v3 ^= d; |
159 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
160 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
161 | 100k | v0 ^= d; |
162 | 100k | d = val.GetUint64(3); |
163 | 100k | v3 ^= d; |
164 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
165 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
166 | 100k | v0 ^= d; |
167 | 100k | d = ((uint64_t{36}) << 56) | extra; |
168 | 100k | v3 ^= d; |
169 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
170 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
171 | 100k | v0 ^= d; |
172 | 100k | v2 ^= 0xFF; |
173 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
174 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
175 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
176 | 100k | SIPROUND; Line | Count | Source | 13 | 100k | #define SIPROUND do { \ | 14 | 100k | v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \ | 15 | 100k | v0 = std::rotl(v0, 32); \ | 16 | 100k | v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \ | 17 | 100k | v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \ | 18 | 100k | v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \ | 19 | 100k | v2 = std::rotl(v2, 32); \ | 20 | 100k | } while (0) |
|
177 | 100k | return v0 ^ v1 ^ v2 ^ v3; |
178 | 100k | } |