Skip to content

Commit 7e00322

Browse files
committed
Add specialization of SipHash for 256 + 32 bit data
We'll need a version of SipHash for tuples of 256 bits and 32 bits data, when CCoinsViewCache switches from using txids to COutPoints as keys.
1 parent e484652 commit 7e00322

File tree

3 files changed

+59
-0
lines changed

3 files changed

+59
-0
lines changed

src/hash.cpp

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,3 +208,44 @@ uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val)
208208
SIPROUND;
209209
return v0 ^ v1 ^ v2 ^ v3;
210210
}
211+
212+
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra)
213+
{
214+
/* Specialized implementation for efficiency */
215+
uint64_t d = val.GetUint64(0);
216+
217+
uint64_t v0 = 0x736f6d6570736575ULL ^ k0;
218+
uint64_t v1 = 0x646f72616e646f6dULL ^ k1;
219+
uint64_t v2 = 0x6c7967656e657261ULL ^ k0;
220+
uint64_t v3 = 0x7465646279746573ULL ^ k1 ^ d;
221+
222+
SIPROUND;
223+
SIPROUND;
224+
v0 ^= d;
225+
d = val.GetUint64(1);
226+
v3 ^= d;
227+
SIPROUND;
228+
SIPROUND;
229+
v0 ^= d;
230+
d = val.GetUint64(2);
231+
v3 ^= d;
232+
SIPROUND;
233+
SIPROUND;
234+
v0 ^= d;
235+
d = val.GetUint64(3);
236+
v3 ^= d;
237+
SIPROUND;
238+
SIPROUND;
239+
v0 ^= d;
240+
d = (((uint64_t)36) << 56) | extra;
241+
v3 ^= d;
242+
SIPROUND;
243+
SIPROUND;
244+
v0 ^= d;
245+
v2 ^= 0xFF;
246+
SIPROUND;
247+
SIPROUND;
248+
SIPROUND;
249+
SIPROUND;
250+
return v0 ^ v1 ^ v2 ^ v3;
251+
}

src/hash.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,5 +241,6 @@ class CSipHasher
241241
* .Finalize()
242242
*/
243243
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256& val);
244+
uint64_t SipHashUint256Extra(uint64_t k0, uint64_t k1, const uint256& val, uint32_t extra);
244245

245246
#endif // BITCOIN_HASH_H

src/test/hash_tests.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,23 @@ BOOST_AUTO_TEST_CASE(siphash)
128128
tx.nVersion = 1;
129129
ss << tx;
130130
BOOST_CHECK_EQUAL(SipHashUint256(1, 2, ss.GetHash()), 0x79751e980c2a0a35ULL);
131+
132+
// Check consistency between CSipHasher and SipHashUint256[Extra].
133+
FastRandomContext ctx;
134+
for (int i = 0; i < 16; ++i) {
135+
uint64_t k1 = ctx.rand64();
136+
uint64_t k2 = ctx.rand64();
137+
uint256 x = GetRandHash();
138+
uint32_t n = ctx.rand32();
139+
uint8_t nb[4];
140+
WriteLE32(nb, n);
141+
CSipHasher sip256(k1, k2);
142+
sip256.Write(x.begin(), 32);
143+
CSipHasher sip288 = sip256;
144+
sip288.Write(nb, 4);
145+
BOOST_CHECK_EQUAL(SipHashUint256(k1, k2, x), sip256.Finalize());
146+
BOOST_CHECK_EQUAL(SipHashUint256Extra(k1, k2, x, n), sip288.Finalize());
147+
}
131148
}
132149

133150
BOOST_AUTO_TEST_SUITE_END()

0 commit comments

Comments
 (0)