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