Bitcoin Core  24.99.0
P2P Digital Currency
crypto_hash.cpp
Go to the documentation of this file.
1 // Copyright (c) 2016-2022 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 
6 #include <bench/bench.h>
7 #include <crypto/muhash.h>
8 #include <crypto/ripemd160.h>
9 #include <crypto/sha1.h>
10 #include <crypto/sha256.h>
11 #include <crypto/sha3.h>
12 #include <crypto/sha512.h>
13 #include <crypto/siphash.h>
14 #include <hash.h>
15 #include <random.h>
16 #include <uint256.h>
17 
18 /* Number of bytes to hash per iteration */
19 static const uint64_t BUFFER_SIZE = 1000*1000;
20 
21 static void BenchRIPEMD160(benchmark::Bench& bench)
22 {
23  uint8_t hash[CRIPEMD160::OUTPUT_SIZE];
24  std::vector<uint8_t> in(BUFFER_SIZE,0);
25  bench.batch(in.size()).unit("byte").run([&] {
26  CRIPEMD160().Write(in.data(), in.size()).Finalize(hash);
27  });
28 }
29 
30 static void SHA1(benchmark::Bench& bench)
31 {
32  uint8_t hash[CSHA1::OUTPUT_SIZE];
33  std::vector<uint8_t> in(BUFFER_SIZE,0);
34  bench.batch(in.size()).unit("byte").run([&] {
35  CSHA1().Write(in.data(), in.size()).Finalize(hash);
36  });
37 }
38 
39 static void SHA256(benchmark::Bench& bench)
40 {
41  uint8_t hash[CSHA256::OUTPUT_SIZE];
42  std::vector<uint8_t> in(BUFFER_SIZE,0);
43  bench.batch(in.size()).unit("byte").run([&] {
44  CSHA256().Write(in.data(), in.size()).Finalize(hash);
45  });
46 }
47 
48 static void SHA3_256_1M(benchmark::Bench& bench)
49 {
50  uint8_t hash[SHA3_256::OUTPUT_SIZE];
51  std::vector<uint8_t> in(BUFFER_SIZE,0);
52  bench.batch(in.size()).unit("byte").run([&] {
53  SHA3_256().Write(in).Finalize(hash);
54  });
55 }
56 
57 static void SHA256_32b(benchmark::Bench& bench)
58 {
59  std::vector<uint8_t> in(32,0);
60  bench.batch(in.size()).unit("byte").run([&] {
61  CSHA256()
62  .Write(in.data(), in.size())
63  .Finalize(in.data());
64  });
65 }
66 
67 static void SHA256D64_1024(benchmark::Bench& bench)
68 {
69  std::vector<uint8_t> in(64 * 1024, 0);
70  bench.batch(in.size()).unit("byte").run([&] {
71  SHA256D64(in.data(), in.data(), 1024);
72  });
73 }
74 
75 static void SHA512(benchmark::Bench& bench)
76 {
77  uint8_t hash[CSHA512::OUTPUT_SIZE];
78  std::vector<uint8_t> in(BUFFER_SIZE,0);
79  bench.batch(in.size()).unit("byte").run([&] {
80  CSHA512().Write(in.data(), in.size()).Finalize(hash);
81  });
82 }
83 
84 static void SipHash_32b(benchmark::Bench& bench)
85 {
86  uint256 x;
87  uint64_t k1 = 0;
88  bench.run([&] {
89  *((uint64_t*)x.begin()) = SipHashUint256(0, ++k1, x);
90  });
91 }
92 
94 {
95  FastRandomContext rng(true);
96  bench.run([&] {
97  rng.rand32();
98  });
99 }
100 
102 {
103  FastRandomContext rng(true);
104  bench.run([&] {
105  rng.randbool();
106  });
107 }
108 
109 static void MuHash(benchmark::Bench& bench)
110 {
111  MuHash3072 acc;
112  unsigned char key[32] = {0};
113  uint32_t i = 0;
114  bench.run([&] {
115  key[0] = ++i & 0xFF;
116  acc *= MuHash3072(key);
117  });
118 }
119 
120 static void MuHashMul(benchmark::Bench& bench)
121 {
122  MuHash3072 acc;
123  FastRandomContext rng(true);
124  MuHash3072 muhash{rng.randbytes(32)};
125 
126  bench.run([&] {
127  acc *= muhash;
128  });
129 }
130 
131 static void MuHashDiv(benchmark::Bench& bench)
132 {
133  MuHash3072 acc;
134  FastRandomContext rng(true);
135  MuHash3072 muhash{rng.randbytes(32)};
136 
137  bench.run([&] {
138  acc /= muhash;
139  });
140 }
141 
143 {
144  MuHash3072 acc;
145  FastRandomContext rng(true);
146  std::vector<unsigned char> key{rng.randbytes(32)};
147 
148  bench.run([&] {
149  MuHash3072{key};
150  });
151 }
152 
158 
164 
static const unsigned char k1[32]
A hasher class for RIPEMD-160.
Definition: ripemd160.h:13
CRIPEMD160 & Write(const unsigned char *data, size_t len)
Definition: ripemd160.cpp:247
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: ripemd160.cpp:273
static const size_t OUTPUT_SIZE
Definition: ripemd160.h:20
A hasher class for SHA1.
Definition: sha1.h:13
CSHA1 & Write(const unsigned char *data, size_t len)
Definition: sha1.cpp:154
static const size_t OUTPUT_SIZE
Definition: sha1.h:20
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: sha1.cpp:180
A hasher class for SHA-256.
Definition: sha256.h:14
static const size_t OUTPUT_SIZE
Definition: sha256.h:21
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: sha256.cpp:707
CSHA256 & Write(const unsigned char *data, size_t len)
Definition: sha256.cpp:681
A hasher class for SHA-512.
Definition: sha512.h:13
static constexpr size_t OUTPUT_SIZE
Definition: sha512.h:20
void Finalize(unsigned char hash[OUTPUT_SIZE])
Definition: sha512.cpp:185
CSHA512 & Write(const unsigned char *data, size_t len)
Definition: sha512.cpp:159
Fast randomness source.
Definition: random.h:144
uint32_t rand32() noexcept
Generate a random 32-bit integer.
Definition: random.h:217
bool randbool() noexcept
Generate a random boolean.
Definition: random.h:223
std::vector< unsigned char > randbytes(size_t len)
Generate random bytes.
Definition: random.cpp:613
A class representing MuHash sets.
Definition: muhash.h:95
Definition: sha3.h:17
SHA3_256 & Write(Span< const unsigned char > data)
Definition: sha3.cpp:111
SHA3_256 & Finalize(Span< unsigned char > output)
Definition: sha3.cpp:141
static constexpr size_t OUTPUT_SIZE
Definition: sha3.h:33
Main entry point to nanobench's benchmarking facility.
Definition: nanobench.h:623
Bench & run(char const *benchmarkName, Op &&op)
Repeatedly calls op() based on the configuration, and performs measurements.
Definition: nanobench.h:1230
Bench & batch(T b) noexcept
Sets the batch size.
Definition: nanobench.h:1254
Bench & unit(char const *unit)
Sets the operation unit.
constexpr unsigned char * begin()
Definition: uint256.h:67
256-bit opaque blob.
Definition: uint256.h:105
static void SipHash_32b(benchmark::Bench &bench)
Definition: crypto_hash.cpp:84
static void FastRandom_1bit(benchmark::Bench &bench)
static void MuHashPrecompute(benchmark::Bench &bench)
static const uint64_t BUFFER_SIZE
Definition: crypto_hash.cpp:19
BENCHMARK(BenchRIPEMD160, benchmark::PriorityLevel::HIGH)
static void SHA256_32b(benchmark::Bench &bench)
Definition: crypto_hash.cpp:57
static void FastRandom_32bit(benchmark::Bench &bench)
Definition: crypto_hash.cpp:93
static void MuHashMul(benchmark::Bench &bench)
static void BenchRIPEMD160(benchmark::Bench &bench)
Definition: crypto_hash.cpp:21
static void SHA256D64_1024(benchmark::Bench &bench)
Definition: crypto_hash.cpp:67
static void SHA3_256_1M(benchmark::Bench &bench)
Definition: crypto_hash.cpp:48
static void SHA1(benchmark::Bench &bench)
Definition: crypto_hash.cpp:30
static void SHA512(benchmark::Bench &bench)
Definition: crypto_hash.cpp:75
static void SHA256(benchmark::Bench &bench)
Definition: crypto_hash.cpp:39
static void MuHashDiv(benchmark::Bench &bench)
static void MuHash(benchmark::Bench &bench)
@ HIGH
Definition: bench.h:47
void SHA256D64(unsigned char *out, const unsigned char *in, size_t blocks)
Compute multiple double-SHA256's of 64-byte blobs.
Definition: sha256.cpp:731
uint64_t SipHashUint256(uint64_t k0, uint64_t k1, const uint256 &val)
Optimized SipHash-2-4 implementation for uint256.
Definition: siphash.cpp:94