Cuckoo Filters
I came across cuckoo filters recently - they're like Bloom filters, but you can actually delete things from them.
A Bloom filter lets you check if something is probably in a set, using way less memory than storing the actual items. The catch is you get false positives (it might say "yes" when the answer is "no"), and you can't remove items once they're added.
Cuckoo filters fix the deletion problem. The name comes from cuckoo hashing - when you insert something and its spot is taken, you kick out whatever's there (like a cuckoo bird pushing eggs out of a nest) and find it a new home. Items get a fingerprint and two possible locations, so there's always somewhere to look.
The tradeoff: slightly more memory per item than a Bloom filter, but you get deletion and often faster lookups.
I could see using these anywhere you'd use a Bloom filter but need to remove items - cache invalidation, tracking "seen" items in a stream, that kind of thing.
let mut cf = CuckooFilter::new();
cf.insert(&"item1");
cf.insert(&"item2");
cf.contains(&"item1"); // true
cf.contains(&"item3"); // false
cf.delete(&"item1");
cf.contains(&"item1"); // false - this is what Bloom filters can't do