|
Aleph-w 3.0
A C++ Library for Data Structures and Algorithms
|
Quotient filter for probabilistic set membership with deletion. More...
#include <quotient-filter.H>
Public Member Functions | |
| Quotient_Filter (uint8_t q, uint8_t r, uint32_t seed=0x5F3759DF) | |
| Construct a quotient filter. | |
| Quotient_Filter & | insert (const T &item) |
| Insert an element. | |
| bool | contains (const T &item) const noexcept |
| Test membership. | |
| bool | remove (const T &item) noexcept |
| Remove an element. | |
| size_t | size () const noexcept |
| Number of elements. | |
| size_t | capacity () const noexcept |
| Number of slots (2^q). | |
| double | load_factor () const noexcept |
| Current load factor. | |
| bool | is_empty () const noexcept |
| True if empty. | |
| uint8_t | q () const noexcept |
| Quotient bits. | |
| uint8_t | r () const noexcept |
| Remainder bits. | |
| double | false_positive_rate () const noexcept |
| Theoretical FP probability ~ 2^{-r}. | |
| uint32_t | seed () const noexcept |
| Hash seed. | |
| size_t | memory_usage () const noexcept |
| Memory usage in bytes. | |
| void | clear () noexcept |
| Remove all elements. | |
| void | merge (const Quotient_Filter &other) |
| Merge another filter (same q, r, seed). | |
| void | swap (Quotient_Filter &other) noexcept |
| Swap in O(1). | |
Static Public Member Functions | |
| static Quotient_Filter | from_capacity (size_t expected_n, double fp_rate, uint32_t seed=0x5F3759DF) |
| Construct from desired capacity and false positive rate. | |
| static std::pair< uint8_t, uint8_t > | estimate (size_t n, double fp_rate) |
| Estimate (q, r) for n elements and target FP rate. | |
Private Types | |
| enum class | Insert_Result { inserted , duplicate , full } |
Private Attributes | |
| uint8_t | q_ |
| uint8_t | r_ |
| size_t | num_slots_ |
| size_t | num_elems_ |
| uint32_t | seed_ |
| Array< uint64_t > | slots_ |
Static Private Attributes | |
| static constexpr uint64_t | OCC_BIT = 1ULL << 0 |
| static constexpr uint64_t | CONT_BIT = 1ULL << 1 |
| static constexpr uint64_t | SHFT_BIT = 1ULL << 2 |
| static constexpr uint64_t | META_MASK = 0x7ULL |
Quotient filter for probabilistic set membership with deletion.
| T | Element type. Must be hashable via murmur3hash(T, seed). |
Definition at line 137 of file quotient-filter.H.
|
strongprivate |
| Enumerator | |
|---|---|
| inserted | |
| duplicate | |
| full | |
Definition at line 378 of file quotient-filter.H.
|
inline |
Construct a quotient filter.
| [in] | q | Number of quotient bits (2^q slots). Must be in [1, 32]. |
| [in] | r | Remainder bits per slot (FP rate ~ 2^{-r}). Must be in [1, 60]. |
| [in] | seed | Hash seed (default: 0x5F3759DF). |
| std::domain_error | if q or r are out of range, or q + r > 64. |
Definition at line 486 of file quotient-filter.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::num_slots_, Aleph::Quotient_Filter< T >::q(), Aleph::Quotient_Filter< T >::r(), and Aleph::Quotient_Filter< T >::slots_.
|
inlinenoexcept |
Number of slots (2^q).
O(1).
Definition at line 615 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_slots_.
|
inlinenoexcept |
Remove all elements.
O(2^q).
Definition at line 663 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_elems_, Aleph::Quotient_Filter< T >::num_slots_, and Aleph::Quotient_Filter< T >::slots_.
|
inlineprivatenoexcept |
Definition at line 304 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::OCC_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::shift_elements_left().
|
inlinenoexcept |
Test membership.
May return false positives (~2^{-r}), never false negatives.
Definition at line 545 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_rem(), and Aleph::Quotient_Filter< T >::incr().
Referenced by demo_merge(), example_performance(), Aleph::Quotient_Filter< T >::insert(), TEST(), TEST(), and TEST().
|
inlineprivatenoexcept |
Definition at line 315 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_slots_.
Referenced by Aleph::Quotient_Filter< T >::find_run_start(), and Aleph::Quotient_Filter< T >::shift_elements_right().
|
inlineprivate |
Definition at line 386 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::duplicate, Aleph::Quotient_Filter< T >::find_first_unused(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::full, Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_rem(), Aleph::Quotient_Filter< T >::incr(), Aleph::Quotient_Filter< T >::inserted, Aleph::Quotient_Filter< T >::num_elems_, Aleph::Quotient_Filter< T >::num_slots_, Aleph::Quotient_Filter< T >::OCC_BIT, Aleph::Quotient_Filter< T >::rem_mask(), Aleph::Quotient_Filter< T >::set_cont(), Aleph::Quotient_Filter< T >::set_element(), Aleph::Quotient_Filter< T >::set_occ(), Aleph::Quotient_Filter< T >::shift_elements_right(), Aleph::Quotient_Filter< T >::slot_empty(), and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::insert(), and Aleph::Quotient_Filter< T >::merge().
|
inlinestatic |
Estimate (q, r) for n elements and target FP rate.
Definition at line 695 of file quotient-filter.H.
References ah_domain_error_if, and Aleph::divide_and_conquer_partition_dp().
Referenced by TEST().
|
inlinenoexcept |
Theoretical FP probability ~ 2^{-r}.
Definition at line 645 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::r_.
|
inlineprivatenoexcept |
Definition at line 354 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::has_element(), and Aleph::Quotient_Filter< T >::incr().
Referenced by Aleph::Quotient_Filter< T >::do_insert().
|
inlineprivatenoexcept |
Definition at line 330 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::decr(), Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_shft(), and Aleph::Quotient_Filter< T >::incr().
Referenced by Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::do_insert(), and Aleph::Quotient_Filter< T >::remove().
|
inlineprivate |
Definition at line 320 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), h, Aleph::murmur3hash(), Aleph::Quotient_Filter< T >::num_slots_, Aleph::Quotient_Filter< T >::q_, Aleph::Quotient_Filter< T >::rem_mask(), and Aleph::Quotient_Filter< T >::seed_.
Referenced by Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::insert(), and Aleph::Quotient_Filter< T >::remove().
|
inlinestatic |
Construct from desired capacity and false positive rate.
| [in] | expected_n | Expected number of elements. |
| [in] | fp_rate | Target false positive probability. |
| [in] | seed | Hash seed. |
| std::domain_error | if expected_n == 0 or fp_rate not in (0,1). |
Definition at line 504 of file quotient-filter.H.
References ah_domain_error_if, Aleph::divide_and_conquer_partition_dp(), and Aleph::Quotient_Filter< T >::seed().
Referenced by demo_cache(), and TEST().
|
inlineprivatenoexcept |
Definition at line 167 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::CONT_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::is_run_start(), Aleph::Quotient_Filter< T >::remove(), and Aleph::Quotient_Filter< T >::shift_elements_left().
|
inlineprivatenoexcept |
Definition at line 162 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::OCC_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::clear_element(), Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::remove(), Aleph::Quotient_Filter< T >::set_element(), Aleph::Quotient_Filter< T >::shift_elements_left(), and Aleph::Quotient_Filter< T >::shift_elements_right().
|
inlineprivatenoexcept |
Definition at line 285 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::rem_mask(), and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::do_insert(), and Aleph::Quotient_Filter< T >::remove().
|
inlineprivatenoexcept |
Definition at line 172 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::SHFT_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::find_run_start(), and Aleph::Quotient_Filter< T >::shift_elements_left().
|
inlineprivatenoexcept |
Definition at line 250 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::META_MASK, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::find_first_unused(), Aleph::Quotient_Filter< T >::is_run_start(), Aleph::Quotient_Filter< T >::remove(), and Aleph::Quotient_Filter< T >::shift_elements_left().
|
inlineprivatenoexcept |
Definition at line 310 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_slots_.
Referenced by Aleph::Quotient_Filter< T >::contains(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::find_first_unused(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::remove(), and Aleph::Quotient_Filter< T >::shift_elements_left().
|
inline |
Insert an element.
After insertion, contains(item) is guaranteed true. Duplicates are silently ignored.
| std::overflow_error | if the filter is full. |
Definition at line 525 of file quotient-filter.H.
References ah_overflow_error, Aleph::Quotient_Filter< T >::contains(), Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::duplicate, Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::full, Aleph::Quotient_Filter< T >::inserted, Aleph::Quotient_Filter< T >::num_elems_, and Aleph::Quotient_Filter< T >::num_slots_.
Referenced by demo_merge(), example_performance(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
True if empty.
O(1).
Definition at line 627 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_elems_.
|
inlineprivatenoexcept |
Definition at line 256 of file quotient-filter.H.
References Aleph::and, Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_cont(), and Aleph::Quotient_Filter< T >::has_element().
|
inlinenoexcept |
Current load factor.
O(1).
Definition at line 621 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_elems_, and Aleph::Quotient_Filter< T >::num_slots_.
|
inlinenoexcept |
Memory usage in bytes.
Definition at line 657 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), and Aleph::Quotient_Filter< T >::num_slots_.
Referenced by example_memory_optimization(), example_performance(), and TEST().
|
inline |
Merge another filter (same q, r, seed).
O(2^q).
| std::domain_error | on parameter mismatch. |
Definition at line 673 of file quotient-filter.H.
References ah_domain_error_if, ah_overflow_error_if, Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::full, Aleph::Quotient_Filter< T >::num_elems_, Aleph::Quotient_Filter< T >::num_slots_, Aleph::Quotient_Filter< T >::q_, Aleph::Quotient_Filter< T >::r_, and Aleph::Quotient_Filter< T >::seed_.
Referenced by demo_merge(), TEST(), TEST(), and TEST().
|
inlinenoexcept |
Quotient bits.
Definition at line 633 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::q_.
Referenced by Aleph::Quotient_Filter< T >::Quotient_Filter().
|
inlinenoexcept |
Remainder bits.
Definition at line 639 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::r_.
Referenced by Aleph::Quotient_Filter< T >::Quotient_Filter().
|
inlineprivatenoexcept |
Definition at line 157 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::r_.
Referenced by Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::get_rem(), Aleph::Quotient_Filter< T >::set_element(), and Aleph::Quotient_Filter< T >::set_rem().
Remove an element.
true if the fingerprint was found and removed. Definition at line 570 of file quotient-filter.H.
References Aleph::and, Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::find_run_start(), Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_rem(), Aleph::Quotient_Filter< T >::has_element(), Aleph::Quotient_Filter< T >::incr(), Aleph::Quotient_Filter< T >::num_elems_, Aleph::Quotient_Filter< T >::set_cont(), Aleph::Quotient_Filter< T >::set_occ(), and Aleph::Quotient_Filter< T >::shift_elements_left().
|
inlinenoexcept |
Hash seed.
Definition at line 651 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::seed_.
Referenced by Aleph::Quotient_Filter< T >::from_capacity().
Definition at line 269 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::CONT_BIT, Aleph::divide_and_conquer_partition_dp(), and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::do_insert(), and Aleph::Quotient_Filter< T >::remove().
|
inlineprivatenoexcept |
Definition at line 297 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::CONT_BIT, Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::OCC_BIT, Aleph::Quotient_Filter< T >::rem_mask(), Aleph::Quotient_Filter< T >::SHFT_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::do_insert().
Definition at line 261 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::OCC_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::remove(), Aleph::Quotient_Filter< T >::shift_elements_left(), and Aleph::Quotient_Filter< T >::shift_elements_right().
|
inlineprivatenoexcept |
Definition at line 290 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::META_MASK, Aleph::Quotient_Filter< T >::rem_mask(), and Aleph::Quotient_Filter< T >::slots_.
Definition at line 277 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::SHFT_BIT, and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::shift_elements_left(), and Aleph::Quotient_Filter< T >::shift_elements_right().
|
inlineprivatenoexcept |
Definition at line 453 of file quotient-filter.H.
References Aleph::and, Aleph::Quotient_Filter< T >::clear_element(), Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_shft(), Aleph::Quotient_Filter< T >::has_element(), Aleph::Quotient_Filter< T >::incr(), Aleph::Quotient_Filter< T >::set_occ(), Aleph::Quotient_Filter< T >::set_shft(), and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::remove().
|
inlineprivatenoexcept |
Definition at line 365 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::decr(), Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::set_occ(), Aleph::Quotient_Filter< T >::set_shft(), and Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::do_insert().
|
inlinenoexcept |
Number of elements.
O(1).
Definition at line 609 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::num_elems_.
Referenced by demo_merge(), and TEST().
|
inlineprivatenoexcept |
Definition at line 178 of file quotient-filter.H.
References Aleph::Quotient_Filter< T >::slots_.
Referenced by Aleph::Quotient_Filter< T >::do_insert().
|
inlinenoexcept |
Swap in O(1).
Definition at line 708 of file quotient-filter.H.
References Aleph::divide_and_conquer_partition_dp(), Aleph::Quotient_Filter< T >::num_elems_, Aleph::Quotient_Filter< T >::num_slots_, Aleph::Quotient_Filter< T >::q_, Aleph::Quotient_Filter< T >::r_, Aleph::Quotient_Filter< T >::seed_, Aleph::Quotient_Filter< T >::slots_, and Aleph::Array< T >::swap().
Referenced by TEST().
|
staticconstexprprivate |
Definition at line 153 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::set_cont(), and Aleph::Quotient_Filter< T >::set_element().
|
staticconstexprprivate |
Definition at line 155 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::has_element(), and Aleph::Quotient_Filter< T >::set_rem().
|
private |
Definition at line 142 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::clear(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::insert(), Aleph::Quotient_Filter< T >::is_empty(), Aleph::Quotient_Filter< T >::load_factor(), Aleph::Quotient_Filter< T >::merge(), Aleph::Quotient_Filter< T >::remove(), Aleph::Quotient_Filter< T >::size(), and Aleph::Quotient_Filter< T >::swap().
|
private |
Definition at line 141 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::Quotient_Filter(), Aleph::Quotient_Filter< T >::capacity(), Aleph::Quotient_Filter< T >::clear(), Aleph::Quotient_Filter< T >::decr(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::incr(), Aleph::Quotient_Filter< T >::insert(), Aleph::Quotient_Filter< T >::load_factor(), Aleph::Quotient_Filter< T >::memory_usage(), Aleph::Quotient_Filter< T >::merge(), and Aleph::Quotient_Filter< T >::swap().
|
staticconstexprprivate |
Definition at line 152 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::clear_element(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::set_element(), and Aleph::Quotient_Filter< T >::set_occ().
|
private |
Definition at line 139 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::merge(), Aleph::Quotient_Filter< T >::q(), and Aleph::Quotient_Filter< T >::swap().
|
private |
Definition at line 140 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::false_positive_rate(), Aleph::Quotient_Filter< T >::merge(), Aleph::Quotient_Filter< T >::r(), Aleph::Quotient_Filter< T >::rem_mask(), and Aleph::Quotient_Filter< T >::swap().
|
private |
Definition at line 143 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::fingerprint(), Aleph::Quotient_Filter< T >::merge(), Aleph::Quotient_Filter< T >::seed(), and Aleph::Quotient_Filter< T >::swap().
|
staticconstexprprivate |
Definition at line 154 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::get_shft(), Aleph::Quotient_Filter< T >::set_element(), and Aleph::Quotient_Filter< T >::set_shft().
Definition at line 150 of file quotient-filter.H.
Referenced by Aleph::Quotient_Filter< T >::Quotient_Filter(), Aleph::Quotient_Filter< T >::clear(), Aleph::Quotient_Filter< T >::clear_element(), Aleph::Quotient_Filter< T >::do_insert(), Aleph::Quotient_Filter< T >::get_cont(), Aleph::Quotient_Filter< T >::get_occ(), Aleph::Quotient_Filter< T >::get_rem(), Aleph::Quotient_Filter< T >::get_shft(), Aleph::Quotient_Filter< T >::has_element(), Aleph::Quotient_Filter< T >::set_cont(), Aleph::Quotient_Filter< T >::set_element(), Aleph::Quotient_Filter< T >::set_occ(), Aleph::Quotient_Filter< T >::set_rem(), Aleph::Quotient_Filter< T >::set_shft(), Aleph::Quotient_Filter< T >::shift_elements_left(), Aleph::Quotient_Filter< T >::shift_elements_right(), Aleph::Quotient_Filter< T >::slot_empty(), and Aleph::Quotient_Filter< T >::swap().