iron_rose 0.1.0

Rust implementation of Invertable Bloom Filters & Strata Estimators as found in https://www.ics.uci.edu/~eppstein/pubs/EppGooUye-SIGCOMM-11.pdf
Documentation

Iron Rose is a rust implementation of Invertable Bloom Filters as found in What's the Difference? Efficient Set Reconciliation without Prior Context

Expected use case looks something like this.

use iron_rose::{Side, StrataEstimator, IBF};
use uuid::Uuid;

let mut estimator = StrataEstimator::default();
let mut remote_estimator = StrataEstimator::default();
# let core = (0..1000)
#     .map(|_| Uuid::new_v4().to_u128_le())
#     .collect::<Vec<_>>();
# let local_ids = (0..50)
#     .map(|_| Uuid::new_v4().to_u128_le())
#     .collect::<Vec<_>>();
# let remote_ids = (0..50)
#     .map(|_| Uuid::new_v4().to_u128_le())
#     .collect::<Vec<_>>();
# let ids_from_database = core.iter().chain(local_ids.iter()).collect::<Vec<_>>();
for x in ids_from_database.iter() {
estimator.encode(**x);
}
# for x in core.iter().chain(remote_ids.iter()) {
#    remote_estimator.encode(*x);
# }
// Retreive Remote Estimator in some way
let ibf_size = estimator
.estimate_differences(&remote_estimator)
.expect("estimators should be same shape");
let mut local = IBF::new(ibf_size);
# let mut remote = IBF::new(ibf_size);
for x in ids_from_database.iter() {
local.encode(**x);
}
# for x in core.iter().chain(remote_ids.iter()) {
#     remote.encode(*x);
# }
// Retreive remote IBF
let diff = (local - remote).expect("Local and remote should be the same shape");
let differences = diff
.decode()
.expect("Successfully decoded because IBFs were large enough");