Skip to content

Commit 9035eb9

Browse files
committed
Introduce GCSFilter::QuerySet a cached hash query set for GCSFilter::MatchAny
Caching the hashed and sorted elements allows for a substantially faster GCSFilter::MatchAny. We will use this later for faster wallet rescans.
1 parent 9cfb3e0 commit 9035eb9

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/blockfilter.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,32 @@ static const std::map<BlockFilterType, std::string> g_filter_types = {
2424
{BlockFilterType::BASIC, "basic"},
2525
};
2626

27+
GCSFilter::QuerySet::QuerySet(const Params& params, const ElementSet& elements)
28+
: m_params(params)
29+
{
30+
for (const Element& element : elements)
31+
insert(element, false);
32+
std::sort(m_hashed_elements.begin(), m_hashed_elements.end());
33+
}
34+
35+
void GCSFilter::QuerySet::insert(const Element& element, bool sort)
36+
{
37+
uint64_t hashed_element = HashElement(element, m_params.m_siphash_k0, m_params.m_siphash_k1);
38+
m_hashed_elements.push_back(hashed_element);
39+
if (sort)
40+
std::sort(m_hashed_elements.begin(), m_hashed_elements.end());
41+
}
42+
43+
std::vector<uint64_t> GCSFilter::QuerySet::sorted_and_ranged(const uint64_t& F) const
44+
{
45+
std::vector<uint64_t> ranged_elements;
46+
ranged_elements.reserve(m_hashed_elements.size());
47+
for (const uint64_t& hashed_element : m_hashed_elements) {
48+
ranged_elements.push_back(RangeHashedElement(hashed_element, F));
49+
}
50+
return ranged_elements;
51+
}
52+
2753
uint64_t GCSFilter::HashElement(const Element& element) const
2854
{
2955
return HashElement(element, m_params.m_siphash_k0, m_params.m_siphash_k1);

src/blockfilter.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ class GCSFilter
4040
{}
4141
};
4242

43+
class QuerySet
44+
{
45+
private:
46+
std::vector<uint64_t> m_hashed_elements;
47+
public:
48+
Params m_params;
49+
QuerySet(const Params& params) : m_params(params) {};
50+
QuerySet(const Params& params, const ElementSet& elements);
51+
void insert(const Element& element, bool sort = true);
52+
std::vector<uint64_t> sorted_and_ranged(const uint64_t& F) const;
53+
};
54+
4355
private:
4456
Params m_params;
4557
uint32_t m_N; //!< Number of elements in the filter

0 commit comments

Comments
 (0)