From 7ff55cc6500e7a32204ffe774d00797f18153547 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C5=91rinc?= Date: Wed, 15 Jul 2026 13:12:05 -0700 Subject: [PATCH] bench: add fixed-width SipHash benchmarks Benchmark 32-byte hashes and inputs consisting of a 32-byte hash plus a 32-bit index with SipHash-2-4 and SipHash-1-3-UJ. The UJ benchmark zero-extends the index into one 64-bit normal block. Keep all four measurements together after shared correctness coverage and before changing `CCoinsMap`'s hasher. Co-authored-by: Pieter Wuille --- src/bench/crypto_hash.cpp | 52 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/bench/crypto_hash.cpp b/src/bench/crypto_hash.cpp index 4d0660db580..827448974fb 100644 --- a/src/bench/crypto_hash.cpp +++ b/src/bench/crypto_hash.cpp @@ -190,10 +190,10 @@ static void SHA512(benchmark::Bench& bench) }); } -static void SipHash_32b(benchmark::Bench& bench) +static void SipHash24_32b(benchmark::Bench& bench) { FastRandomContext rng{/*fDeterministic=*/true}; - PresaltedSipHasher presalted_sip_hasher(rng.rand64(), rng.rand64()); + PresaltedSipHasher presalted_sip_hasher{rng.rand64(), rng.rand64()}; auto val{rng.rand256()}; auto i{0U}; bench.run([&] { @@ -203,6 +203,49 @@ static void SipHash_32b(benchmark::Bench& bench) }); } +static void SipHash24_36b(benchmark::Bench& bench) +{ + FastRandomContext rng{/*fDeterministic=*/true}; + PresaltedSipHasher presalted_sip_hasher{rng.rand64(), rng.rand64()}; + auto val{rng.rand256()}; + uint32_t extra{rng.rand32()}; + auto i{0U}; + bench.run([&] { + ankerl::nanobench::doNotOptimizeAway(presalted_sip_hasher(val, extra)); + ++i; + val.data()[i % uint256::size()] ^= i & 0xFF; + extra += i; + }); +} + +static void SipHash13UJ_32b(benchmark::Bench& bench) +{ + FastRandomContext rng{/*fDeterministic=*/true}; + SipHasher13UJ sip_hasher{rng.rand64(), rng.rand64()}; + auto val{rng.rand256()}; + auto i{0U}; + bench.run([&] { + ankerl::nanobench::doNotOptimizeAway(sip_hasher.Hash(val)); + ++i; + val.data()[i % uint256::size()] ^= i & 0xFF; + }); +} + +static void SipHash13UJ_36b(benchmark::Bench& bench) +{ + FastRandomContext rng{/*fDeterministic=*/true}; + SipHasher13UJ sip_hasher{rng.rand64(), rng.rand64()}; + auto val{rng.rand256()}; + uint32_t extra{rng.rand32()}; + auto i{0U}; + bench.run([&] { + ankerl::nanobench::doNotOptimizeAway(sip_hasher.Hash(val, uint64_t{extra})); + ++i; + val.data()[i % uint256::size()] ^= i & 0xFF; + extra += i; + }); +} + static void MuHash(benchmark::Bench& bench) { MuHash3072 acc; @@ -273,7 +316,10 @@ BENCHMARK(SHA256_32b_STANDARD); BENCHMARK(SHA256_32b_SSE4); BENCHMARK(SHA256_32b_AVX2); BENCHMARK(SHA256_32b_SHANI); -BENCHMARK(SipHash_32b); +BENCHMARK(SipHash24_32b); +BENCHMARK(SipHash24_36b); +BENCHMARK(SipHash13UJ_32b); +BENCHMARK(SipHash13UJ_36b); BENCHMARK(SHA256D64_1024_STANDARD); BENCHMARK(SHA256D64_1024_SSE4); BENCHMARK(SHA256D64_1024_AVX2);