Branch data Line data Source code
1 : : // Copyright (c) 2019-present 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 : : #ifndef BITCOIN_UTIL_HASHER_H
6 : : #define BITCOIN_UTIL_HASHER_H
7 : :
8 : : #include <crypto/common.h>
9 : : #include <crypto/siphash.h>
10 : : #include <primitives/transaction.h>
11 : : #include <span.h>
12 : : #include <uint256.h>
13 : :
14 : : #include <concepts>
15 : : #include <cstdint>
16 : : #include <cstring>
17 : :
18 : : class SaltedUint256Hasher
19 : : {
20 : : const PresaltedSipHasher m_hasher;
21 : :
22 : : public:
23 : : SaltedUint256Hasher();
24 : :
25 : 151 : size_t operator()(const uint256& hash) const
26 : : {
27 : 151 : return m_hasher(hash);
28 : : }
29 : : };
30 : :
31 : : class SaltedTxidHasher
32 : : {
33 : : const PresaltedSipHasher m_hasher;
34 : :
35 : : public:
36 : : SaltedTxidHasher();
37 : :
38 : 781561 : size_t operator()(const Txid& txid) const
39 : : {
40 : 781561 : return m_hasher(txid.ToUint256());
41 : : }
42 : : };
43 : :
44 : : class SaltedWtxidHasher
45 : : {
46 : : const PresaltedSipHasher m_hasher;
47 : :
48 : : public:
49 : : SaltedWtxidHasher();
50 : :
51 : 58163 : size_t operator()(const Wtxid& wtxid) const
52 : : {
53 : 58163 : return m_hasher(wtxid.ToUint256());
54 : : }
55 : : };
56 : :
57 : : class SaltedOutpointHasher
58 : : {
59 : : const PresaltedSipHasher m_hasher;
60 : :
61 : : public:
62 : : SaltedOutpointHasher(bool deterministic = false);
63 : :
64 : : /**
65 : : * Having the hash noexcept allows libstdc++'s unordered_map to recalculate
66 : : * the hash during rehash, so it does not have to cache the value. This
67 : : * reduces node's memory by sizeof(size_t). The required recalculation has
68 : : * a slight performance penalty (around 1.6%), but this is compensated by
69 : : * memory savings of about 9% which allow for a larger dbcache setting.
70 : : *
71 : : * @see https://gcc.gnu.org/onlinedocs/gcc-13.2.0/libstdc++/manual/manual/unordered_associative.html
72 : : */
73 : 90458057 : size_t operator()(const COutPoint& id) const noexcept
74 : : {
75 : 90458057 : return m_hasher(id.hash.ToUint256(), id.n);
76 : : }
77 : : };
78 : :
79 : : /**
80 : : * We're hashing a nonce into the entries themselves, so we don't need extra
81 : : * blinding in the set hash computation.
82 : : *
83 : : * This may exhibit platform endian dependent behavior but because these are
84 : : * nonced hashes (random) and this state is only ever used locally it is safe.
85 : : * All that matters is local consistency.
86 : : */
87 : : class SignatureCacheHasher
88 : : {
89 : : public:
90 : : template <uint8_t hash_select>
91 : 3827000 : uint32_t operator()(const uint256& key) const
92 : : {
93 : : static_assert(hash_select <8, "SignatureCacheHasher only has 8 hashes available.");
94 : : uint32_t u;
95 : 3827000 : std::memcpy(&u, key.begin()+4*hash_select, 4);
96 : : return u;
97 : : }
98 : : };
99 : :
100 : : struct BlockHasher
101 : : {
102 : : // this used to call `GetCheapHash()` in uint256, which was later moved; the
103 : : // cheap hash function simply calls ReadLE64() however, so the end result is
104 : : // identical
105 [ + + ]: 59251 : size_t operator()(const uint256& hash) const { return ReadLE64(hash.begin()); }
106 : : };
107 : :
108 : : class SaltedSipHasher
109 : : {
110 : : private:
111 : : /** Salt */
112 : : const uint64_t m_k0, m_k1;
113 : :
114 : : public:
115 : : SaltedSipHasher();
116 : :
117 : : size_t operator()(const std::span<const unsigned char>& script) const;
118 : : };
119 : :
120 : : #endif // BITCOIN_UTIL_HASHER_H
|