/
githubmirror
/
bitcoin
Обзор
Документация
Войти
/
githubmirror
/
bitcoin
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/bench/crypto_hash.cpp
332 строки
10 KB
Lőrinc
bench: add fixed-width SipHash benchmarks
18 июл 2026, 08:55
Не верифицирован
18 июл 2026, 08:55
7ff55cc
Код
Авторство
О чём код?
// Copyright (c) 2016-present The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include <bench/bench.h> #include <crypto/muhash.h> #include <crypto/ripemd160.h> #include <crypto/sha1.h> #include <crypto/sha256.h> #include <crypto/sha3.h> #include <crypto/sha512.h> #include <crypto/siphash.h> #include <random.h> #include <tinyformat.h> #include <uint256.h> #include <cstdint> #include <span> #include <string> #include <vector> /* Number of bytes to hash per iteration */ static const uint64_t BUFFER_SIZE = 1000*1000; static void BenchRIPEMD160(benchmark::Bench& bench) { uint8_t hash[CRIPEMD160::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CRIPEMD160().Write(in.data(), in.size()).Finalize(hash); }); } static void SHA1(benchmark::Bench& bench) { uint8_t hash[CSHA1::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA1().Write(in.data(), in.size()).Finalize(hash); }); } static void SHA256_STANDARD(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::STANDARD))); uint8_t hash[CSHA256::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256().Write(in.data(), in.size()).Finalize(hash); }); SHA256AutoDetect(); } static void SHA256_SSE4(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4))); uint8_t hash[CSHA256::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256().Write(in.data(), in.size()).Finalize(hash); }); SHA256AutoDetect(); } static void SHA256_AVX2(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_AVX2))); uint8_t hash[CSHA256::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256().Write(in.data(), in.size()).Finalize(hash); }); SHA256AutoDetect(); } static void SHA256_SHANI(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_SHANI))); uint8_t hash[CSHA256::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256().Write(in.data(), in.size()).Finalize(hash); }); SHA256AutoDetect(); } static void SHA3_256_1M(benchmark::Bench& bench) { uint8_t hash[SHA3_256::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { SHA3_256().Write(in).Finalize(hash); }); } static void SHA256_32b_STANDARD(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::STANDARD))); std::vector<uint8_t> in(32,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256() .Write(in.data(), in.size()) .Finalize(in.data()); }); SHA256AutoDetect(); } static void SHA256_32b_SSE4(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4))); std::vector<uint8_t> in(32,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256() .Write(in.data(), in.size()) .Finalize(in.data()); }); SHA256AutoDetect(); } static void SHA256_32b_AVX2(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_AVX2))); std::vector<uint8_t> in(32,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256() .Write(in.data(), in.size()) .Finalize(in.data()); }); SHA256AutoDetect(); } static void SHA256_32b_SHANI(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_SHANI))); std::vector<uint8_t> in(32,0); bench.batch(in.size()).unit("byte").run([&] { CSHA256() .Write(in.data(), in.size()) .Finalize(in.data()); }); SHA256AutoDetect(); } static void SHA256D64_1024_STANDARD(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::STANDARD))); std::vector<uint8_t> in(64 * 1024, 0); bench.batch(in.size()).unit("byte").run([&] { SHA256D64(in.data(), in.data(), 1024); }); SHA256AutoDetect(); } static void SHA256D64_1024_SSE4(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4))); std::vector<uint8_t> in(64 * 1024, 0); bench.batch(in.size()).unit("byte").run([&] { SHA256D64(in.data(), in.data(), 1024); }); SHA256AutoDetect(); } static void SHA256D64_1024_AVX2(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_AVX2))); std::vector<uint8_t> in(64 * 1024, 0); bench.batch(in.size()).unit("byte").run([&] { SHA256D64(in.data(), in.data(), 1024); }); SHA256AutoDetect(); } static void SHA256D64_1024_SHANI(benchmark::Bench& bench) { bench.name(strprintf("%s using the '%s' SHA256 implementation", __func__, SHA256AutoDetect(sha256_implementation::USE_SSE4_AND_SHANI))); std::vector<uint8_t> in(64 * 1024, 0); bench.batch(in.size()).unit("byte").run([&] { SHA256D64(in.data(), in.data(), 1024); }); SHA256AutoDetect(); } static void SHA512(benchmark::Bench& bench) { uint8_t hash[CSHA512::OUTPUT_SIZE]; std::vector<uint8_t> in(BUFFER_SIZE,0); bench.batch(in.size()).unit("byte").run([&] { CSHA512().Write(in.data(), in.size()).Finalize(hash); }); } static void SipHash24_32b(benchmark::Bench& bench) { FastRandomContext rng{/*fDeterministic=*/true}; PresaltedSipHasher presalted_sip_hasher{rng.rand64(), rng.rand64()}; auto val{rng.rand256()}; auto i{0U}; bench.run([&] { ankerl::nanobench::doNotOptimizeAway(presalted_sip_hasher(val)); ++i; val.data()[i % uint256::size()] ^= i & 0xFF; }); } 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; unsigned char key[32] = {0}; uint32_t i = 0; bench.run([&] { key[0] = ++i & 0xFF; acc *= MuHash3072(key); }); } static void MuHashMul(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); MuHash3072 muhash{rng.randbytes(32)}; bench.run([&] { acc *= muhash; }); } static void MuHashDiv(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); MuHash3072 muhash{rng.randbytes(32)}; bench.run([&] { acc /= muhash; }); } static void MuHashPrecompute(benchmark::Bench& bench) { MuHash3072 acc; FastRandomContext rng(true); std::vector<unsigned char> key{rng.randbytes(32)}; bench.run([&] { MuHash3072{key}; }); } static void MuHashFinalize(benchmark::Bench& bench) { FastRandomContext rng(true); MuHash3072 acc{rng.randbytes(32)}; acc /= MuHash3072{rng.rand256()}; bench.run([&] { uint256 out; acc.Finalize(out); acc /= MuHash3072{out}; }); } BENCHMARK(BenchRIPEMD160); BENCHMARK(SHA1); BENCHMARK(SHA256_STANDARD); BENCHMARK(SHA256_SSE4); BENCHMARK(SHA256_AVX2); BENCHMARK(SHA256_SHANI); BENCHMARK(SHA512); BENCHMARK(SHA3_256_1M); BENCHMARK(SHA256_32b_STANDARD); BENCHMARK(SHA256_32b_SSE4); BENCHMARK(SHA256_32b_AVX2); BENCHMARK(SHA256_32b_SHANI); BENCHMARK(SipHash24_32b); BENCHMARK(SipHash24_36b); BENCHMARK(SipHash13UJ_32b); BENCHMARK(SipHash13UJ_36b); BENCHMARK(SHA256D64_1024_STANDARD); BENCHMARK(SHA256D64_1024_SSE4); BENCHMARK(SHA256D64_1024_AVX2); BENCHMARK(SHA256D64_1024_SHANI); BENCHMARK(MuHash); BENCHMARK(MuHashMul); BENCHMARK(MuHashDiv); BENCHMARK(MuHashPrecompute); BENCHMARK(MuHashFinalize);