mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
blockfilter: Implement GCSFilter Match methods.
This commit is contained in:
@@ -149,3 +149,47 @@ GCSFilter::GCSFilter(uint64_t siphash_k0, uint64_t siphash_k1, uint8_t P, uint32
|
|||||||
|
|
||||||
bitwriter.Flush();
|
bitwriter.Flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GCSFilter::MatchInternal(const uint64_t* element_hashes, size_t size) const
|
||||||
|
{
|
||||||
|
VectorReader stream(GCS_SER_TYPE, GCS_SER_VERSION, m_encoded, 0);
|
||||||
|
|
||||||
|
// Seek forward by size of N
|
||||||
|
uint64_t N = ReadCompactSize(stream);
|
||||||
|
assert(N == m_N);
|
||||||
|
|
||||||
|
BitStreamReader<VectorReader> bitreader(stream);
|
||||||
|
|
||||||
|
uint64_t value = 0;
|
||||||
|
size_t hashes_index = 0;
|
||||||
|
for (uint32_t i = 0; i < m_N; ++i) {
|
||||||
|
uint64_t delta = GolombRiceDecode(bitreader, m_P);
|
||||||
|
value += delta;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (hashes_index == size) {
|
||||||
|
return false;
|
||||||
|
} else if (element_hashes[hashes_index] == value) {
|
||||||
|
return true;
|
||||||
|
} else if (element_hashes[hashes_index] > value) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
hashes_index++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GCSFilter::Match(const Element& element) const
|
||||||
|
{
|
||||||
|
uint64_t query = HashToRange(element);
|
||||||
|
return MatchInternal(&query, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GCSFilter::MatchAny(const ElementSet& elements) const
|
||||||
|
{
|
||||||
|
const std::vector<uint64_t> queries = BuildHashedSet(elements);
|
||||||
|
return MatchInternal(queries.data(), queries.size());
|
||||||
|
}
|
||||||
|
|||||||
@@ -36,6 +36,9 @@ private:
|
|||||||
|
|
||||||
std::vector<uint64_t> BuildHashedSet(const ElementSet& elements) const;
|
std::vector<uint64_t> BuildHashedSet(const ElementSet& elements) const;
|
||||||
|
|
||||||
|
/** Helper method used to implement Match and MatchAny */
|
||||||
|
bool MatchInternal(const uint64_t* sorted_element_hashes, size_t size) const;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
/** Constructs an empty filter. */
|
/** Constructs an empty filter. */
|
||||||
|
|||||||
Reference in New Issue
Block a user