13#define SIPROUND do { \
14 v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \
15 v0 = std::rotl(v0, 32); \
16 v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \
17 v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \
18 v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \
19 v2 = std::rotl(v2, 32); \
24 v[0] = 0x736f6d6570736575ULL ^ k0;
25 v[1] = 0x646f72616e646f6dULL ^ k1;
26 v[2] = 0x6c7967656e657261ULL ^ k0;
27 v[3] = 0x7465646279746573ULL ^ k1;
34 uint64_t v0 =
v[0], v1 =
v[1], v2 =
v[2], v3 =
v[3];
54 uint64_t v0 =
v[0], v1 =
v[1], v2 =
v[2], v3 =
v[3];
58 while (
data.size() > 0) {
59 t |= uint64_t{
data.front()} << (8 * (c % 8));
83 uint64_t v0 =
v[0], v1 =
v[1], v2 =
v[2], v3 =
v[3];
85 uint64_t
t =
tmp | (((uint64_t)
count) << 56);
96 return v0 ^ v1 ^ v2 ^ v3;
104 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
105 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
106 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
107 uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
127 v3 ^= (uint64_t{4}) << 59;
130 v0 ^= (uint64_t{4}) << 59;
136 return v0 ^ v1 ^ v2 ^ v3;
144 uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
145 uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
146 uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
147 uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
167 d = ((uint64_t{36}) << 56) | extra;
177 return v0 ^ v1 ^ v2 ^ v3;
uint64_t Finalize() const
Compute the 64-bit SipHash-2-4 of the data written so far.
CSipHasher(uint64_t k0, uint64_t k1)
Construct a SipHash calculator initialized with 128-bit key (k0, k1)
CSipHasher & Write(uint64_t data)
Hash a 64-bit integer worth of data It is treated as if this was the little-endian interpretation of ...
constexpr uint64_t GetUint64(int pos) const
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256 &val, uint32_t extra)
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256 &val)
Optimized SipHash-2-4 implementation for uint256.