1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//! A variant of [Cuckoo Filter][cuckoo filter] whose size automatically scales as necessary.
//!
//! # Examples
//!
//! Basic usage:
//!
//! ```
//! use scalable_cuckoo_filter::ScalableCuckooFilter;
//!
//! let mut filter = ScalableCuckooFilter::new(100, 0.001);
//! assert!(!filter.contains("foo"));
//! filter.insert("foo");
//! assert!(filter.contains("foo"));
//! ```
//!
//! Filter grows automatically:
//!
//! ```
//! use scalable_cuckoo_filter::ScalableCuckooFilter;
//!
//! let mut filter = ScalableCuckooFilter::new(100, 0.001);
//! assert_eq!(filter.capacity(), 128);
//!
//! for i in 0..1000 {
//!     filter.insert(&i);
//! }
//! assert_eq!(filter.capacity(), 1923);
//! ```
//!
//! Filter shrinking:
//!
//! ```
//! use scalable_cuckoo_filter::ScalableCuckooFilter;
//!
//! let mut filter = ScalableCuckooFilter::new(1000, 0.001);
//! for i in 0..100 {
//!     filter.insert(&i);
//! }
//! assert_eq!(filter.capacity(), 1024);
//! assert_eq!(filter.bits(), 14336);
//!
//! filter.shrink_to_fit();
//! for i in 0..100 {
//!     assert!(filter.contains(&i));
//! }
//! assert_eq!(filter.capacity(), 128);
//! assert_eq!(filter.bits(), 1792);
//! ```
//!
//! # References
//!
//! - [Cuckoo Filter: Practically Better Than Bloom][cuckoo filter]
//! - [Scalable Bloom Filters][scalable bloom filters]
//!
//! [cuckoo filter]: https://www.cs.cmu.edu/~dga/papers/cuckoo-conext2014.pdf
//! [scalable bloom filters]: http://haslab.uminho.pt/cbm/files/dbloom.pdf
#![warn(missing_docs)]

pub use crate::scalable_cuckoo_filter::{
    DefaultHasher, DefaultRng, ScalableCuckooFilter, ScalableCuckooFilterBuilder,
};

mod bits;
mod buckets;
mod cuckoo_filter;
mod scalable_cuckoo_filter;

#[inline]
fn hash<T: ?Sized + std::hash::Hash, H: std::hash::Hasher + Clone>(hasher: &H, item: &T) -> u64 {
    let mut hasher = hasher.clone();
    item.hash(&mut hasher);
    hasher.finish()
}