hyperminhash 0.2.3

Fast, constant-memory cardinality approximation
Documentation
use hyperminhash;
use rand;

use std::collections;

fn main() {
    for k in 3..8 {
        let k = 10u64.pow(k);
        println!(
            r#"

#### Max cardinality {}
Set1|HLL1|Set2|HLL2|S1 ∪ S2|HLL1 ∪ HLL2|S1 ∩ S2|HLL1 ∩ HLL2|
----|----|----|----|-------|-----------|-------|-----------|"#,
            k
        );

        for _ in 1..5 {
            let size1 = rand::random::<u64>() % k;
            let size2 = rand::random::<u64>() % k;
            let mut sk1 = hyperminhash::Sketch::default();
            let mut sk2 = hyperminhash::Sketch::default();
            let cols = rand::random::<u64>() % size1.min(size2);
            let mut intersections = 0;
            let mut set =
                collections::HashMap::<u64, u64>::with_capacity(size1.max(size2) as usize);
            for i in 0..size1 {
                *set.entry(i).or_default() += 1;
                sk1.add(i);
            }
            for i in (size1 - cols)..(size1 - cols + size2) {
                set.entry(i)
                    .and_modify(|e| {
                        *e += 1;
                        intersections += 1
                    })
                    .or_insert(1);
                sk2.add(i);
            }

            let card1 = sk1.cardinality();
            let card2 = sk2.cardinality();
            let ints1 = sk1.intersection(&sk2);
            let mcard = sk1.union(&sk2).cardinality();
            println!(
                "{0}|{1:.0}|{2}|{3:.0}|{4}|{5:.0}|{6}|{7:.0}",
                size1,
                card1,
                size2,
                card2,
                set.len(),
                mcard,
                cols,
                ints1
            );
        }
    }
}