Bitcoin Core 30.99.0
P2P Digital Currency
hasher.h
Go to the documentation of this file.
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>
11#include <span.h>
12#include <uint256.h>
13
14#include <concepts>
15#include <cstdint>
16#include <cstring>
17
19{
21
22public:
24
25 size_t operator()(const uint256& hash) const
26 {
27 return m_hasher(hash);
28 }
29};
30
32{
34
35public:
37
38 size_t operator()(const Txid& txid) const
39 {
40 return m_hasher(txid.ToUint256());
41 }
42};
43
45{
47
48public:
50
51 size_t operator()(const Wtxid& wtxid) const
52 {
53 return m_hasher(wtxid.ToUint256());
54 }
55};
56
58{
60
61public:
62 SaltedOutpointHasher(bool deterministic = false);
63
73 size_t operator()(const COutPoint& id) const noexcept
74 {
75 return m_hasher(id.hash.ToUint256(), id.n);
76 }
77};
78
80 size_t operator()(const uint256& hash) const { return ReadLE64(hash.begin()); }
81};
82
92{
93public:
94 template <uint8_t hash_select>
95 uint32_t operator()(const uint256& key) const
96 {
97 static_assert(hash_select <8, "SignatureCacheHasher only has 8 hashes available.");
98 uint32_t u;
99 std::memcpy(&u, key.begin()+4*hash_select, 4);
100 return u;
101 }
102};
103
105{
106 // this used to call `GetCheapHash()` in uint256, which was later moved; the
107 // cheap hash function simply calls ReadLE64() however, so the end result is
108 // identical
109 size_t operator()(const uint256& hash) const { return ReadLE64(hash.begin()); }
110};
111
113{
114private:
116 const uint64_t m_k0, m_k1;
117
118public:
120
121 size_t operator()(const std::span<const unsigned char>& script) const;
122};
123
124#endif // BITCOIN_UTIL_HASHER_H
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition: transaction.h:29
Optimized SipHash-2-4 implementation for uint256.
Definition: siphash.h:56
const PresaltedSipHasher m_hasher
Definition: hasher.h:59
size_t operator()(const COutPoint &id) const noexcept
Having the hash noexcept allows libstdc++'s unordered_map to recalculate the hash during rehash,...
Definition: hasher.h:73
SaltedOutpointHasher(bool deterministic=false)
Definition: hasher.cpp:25
size_t operator()(const std::span< const unsigned char > &script) const
Definition: hasher.cpp:35
const uint64_t m_k0
Salt.
Definition: hasher.h:116
const uint64_t m_k1
Definition: hasher.h:116
const PresaltedSipHasher m_hasher
Definition: hasher.h:33
size_t operator()(const Txid &txid) const
Definition: hasher.h:38
const PresaltedSipHasher m_hasher
Definition: hasher.h:20
size_t operator()(const uint256 &hash) const
Definition: hasher.h:25
size_t operator()(const Wtxid &wtxid) const
Definition: hasher.h:51
const PresaltedSipHasher m_hasher
Definition: hasher.h:46
We're hashing a nonce into the entries themselves, so we don't need extra blinding in the set hash co...
Definition: hasher.h:92
uint32_t operator()(const uint256 &key) const
Definition: hasher.h:95
constexpr unsigned char * begin()
Definition: uint256.h:100
const uint256 & ToUint256() const LIFETIMEBOUND
256-bit opaque blob.
Definition: uint256.h:195
uint64_t ReadLE64(const B *ptr)
Definition: common.h:35
size_t operator()(const uint256 &hash) const
Definition: hasher.h:109
size_t operator()(const uint256 &hash) const
Definition: hasher.h:80