Bitcoin Core 31.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 <uint256.h>
12
13#include <cstdint>
14#include <cstring>
15#include <span>
16
18{
20
21public:
23
24 size_t operator()(const uint256& hash) const
25 {
26 return m_hasher(hash);
27 }
28};
29
31{
33
34public:
36
37 size_t operator()(const Txid& txid) const
38 {
39 return m_hasher(txid.ToUint256());
40 }
41};
42
44{
46
47public:
49
50 size_t operator()(const Wtxid& wtxid) const
51 {
52 return m_hasher(wtxid.ToUint256());
53 }
54};
55
57{
59
60public:
61 SaltedOutpointHasher(bool deterministic = false);
62
72 size_t operator()(const COutPoint& id) const noexcept
73 {
74 return m_hasher(id.hash.ToUint256(), id.n);
75 }
76};
77
87{
88public:
89 template <uint8_t hash_select>
90 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 std::memcpy(&u, key.begin()+4*hash_select, 4);
95 return u;
96 }
97};
98
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 size_t operator()(const uint256& hash) const { return ReadLE64(hash.begin()); }
105};
106
108{
109private:
111 const uint64_t m_k0, m_k1;
112
113public:
115
116 size_t operator()(const std::span<const unsigned char>& script) const;
117};
118
119#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:58
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:72
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:111
const uint64_t m_k1
Definition: hasher.h:111
const PresaltedSipHasher m_hasher
Definition: hasher.h:32
size_t operator()(const Txid &txid) const
Definition: hasher.h:37
const PresaltedSipHasher m_hasher
Definition: hasher.h:19
size_t operator()(const uint256 &hash) const
Definition: hasher.h:24
size_t operator()(const Wtxid &wtxid) const
Definition: hasher.h:50
const PresaltedSipHasher m_hasher
Definition: hasher.h:45
We're hashing a nonce into the entries themselves, so we don't need extra blinding in the set hash co...
Definition: hasher.h:87
uint32_t operator()(const uint256 &key) const
Definition: hasher.h:90
constexpr unsigned char * begin()
Definition: uint256.h:101
const uint256 & ToUint256() const LIFETIMEBOUND
256-bit opaque blob.
Definition: uint256.h:196
uint64_t ReadLE64(const B *ptr)
Definition: common.h:35
size_t operator()(const uint256 &hash) const
Definition: hasher.h:104