Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
805b5e2
[cryptography] move bloomfilter to module dir
andresilva Jan 7, 2026
46b7c42
[cryptography/bloomfilter] add benchmark
andresilva Jan 7, 2026
2e17353
[cryptopgrahy/bloomfilter] make number of bits a power of two
andresilva Jan 7, 2026
e81e11a
[cryptography/bloomfilter] fix tests
andresilva Jan 7, 2026
73d90c2
[cryptography/bloomfilter] stats
andresilva Jan 7, 2026
a2cadf8
[cryptography/bloomfilter] tighten
andresilva Jan 7, 2026
0b8b08b
[cryptography/bloomfilter] fix arbitrary instance
andresilva Jan 7, 2026
04ae331
[cryptography] conformance
andresilva Jan 7, 2026
e23979c
[cryptography/bloomfilter] fix no_std
andresilva Jan 7, 2026
5589649
[cryptography/bloomfilter] validate false_positive_rate
andresilva Jan 7, 2026
2cb54e5
[cryptography/bloomfilter] make sure h2 is non-zero
andresilva Jan 8, 2026
b4ea449
[cryptography/bloomfilter] generic over Hasher
andresilva Jan 8, 2026
58cb70d
[cryptography/bloomfilter] better benchmarks
andresilva Jan 8, 2026
ccf34ce
[cryptography/bloomfilter] lighter benches
andresilva Jan 8, 2026
6063bc5
[cryptography/bloomfilter] lint
andresilva Jan 8, 2026
d74c06f
[cryptography/bloomfilter] fix fuzzer input
andresilva Jan 8, 2026
adae91c
[cryptography/bloomfilter] add getters for bits and hashers
andresilva Jan 8, 2026
1d84f4a
[cryptography/bloomfilter] fuzz with_rate constructor
andresilva Jan 8, 2026
c94b14a
[cryptography/bloomfilter] Read validates that bits is power of two
andresilva Jan 8, 2026
700db56
[cryptography/bloomfilter] fuzz fixes
andresilva Jan 8, 2026
f69fc9c
[cryptography/bloomfilter] expected items is NonZeroUsize
andresilva Jan 8, 2026
e131f6b
[cryptography/bloomfilter] fix overflow
andresilva Jan 8, 2026
52888a8
[cryptography/bloomfilter] fix arbitrary
andresilva Jan 8, 2026
a0e0a3c
[cryptography/bloomfilter] update conformance
andresilva Jan 8, 2026
e049669
standardize benchmark format
patrick-ogrady Jan 9, 2026
98191f4
[cryptography/bloomfilter] fmt
andresilva Jan 9, 2026
f130dde
[cryptography/bloomfilter] use integer math only
andresilva Jan 9, 2026
5eeb208
[cryptography/bloomfilter] docs
andresilva Jan 9, 2026
9999706
[cryptography/bloomfilter] fix no_std
andresilva Jan 9, 2026
b6adff7
[cryptography/bloomfilter] fix overflow
andresilva Jan 9, 2026
9c83383
[cryptography/bloomfilter] lint
andresilva Jan 9, 2026
39df4d2
[cryptography/bloomfilter] no_std
andresilva Jan 9, 2026
9994592
[cryptography/bloomfilter] conformance test
andresilva Jan 9, 2026
cd4768f
[cryptography/bloomfilter] fmt
andresilva Jan 9, 2026
1107f16
[cryptography/bloomfilter] Use `BigRational` for Determinism (#2866)
patrick-ogrady Jan 19, 2026
36a2889
Merge branch 'main' into andre/bloomfilter-improvements
andresilva Jan 19, 2026
87836e8
[cryptography] lint
andresilva Jan 19, 2026
dfecdb2
[cryptography/bloomfilter] address review
andresilva Jan 19, 2026
574e3f7
use log2_ceil
patrick-ogrady Jan 19, 2026
67780ad
nits
patrick-ogrady Jan 19, 2026
cba14c0
use log2_floor
patrick-ogrady Jan 19, 2026
d052b41
fmt
patrick-ogrady Jan 19, 2026
eb675f6
nit
patrick-ogrady Jan 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions cryptography/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -127,3 +127,8 @@ path = "src/lthash/benches/bench.rs"
name = "handshake"
harness = false
path = "src/handshake/benches/bench.rs"

[[bench]]
name = "bloomfilter"
harness = false
path = "src/bloomfilter/benches/bench.rs"
2 changes: 1 addition & 1 deletion cryptography/conformance.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ hash = "c0501d4a691d1fccec7c5906e8608228569d24164150edd215838593e3b77512"

["commonware_cryptography::bloomfilter::tests::conformance::CodecConformance<BloomFilter>"]
n_cases = 65536
hash = "a75d6312366816126114abdc9d7fbd246891cab210eeae6a02781625aa1ad6a4"
hash = "317e8cff35afe47fc6b795dbf27ab30b6a675784b8e92ee270eb8cf738da96a5"

["commonware_cryptography::bls12381::certificate::multisig::tests::conformance::CodecConformance<Certificate<MinSig>>"]
n_cases = 65536
Expand Down
274 changes: 0 additions & 274 deletions cryptography/src/bloomfilter.rs

This file was deleted.

6 changes: 6 additions & 0 deletions cryptography/src/bloomfilter/benches/bench.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
use criterion::criterion_main;

mod contains;
mod insert;

criterion_main!(insert::benches, contains::benches);
79 changes: 79 additions & 0 deletions cryptography/src/bloomfilter/benches/contains.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
use commonware_cryptography::BloomFilter;
use commonware_utils::{NZUsize, NZU8};
use criterion::{criterion_group, BenchmarkId, Criterion, Throughput};
use rand::{rngs::StdRng, RngCore, SeedableRng};
use std::collections::HashSet;

fn benchmark_contains(c: &mut Criterion, name: &str, query_inserted: bool) {
let mut group = c.benchmark_group(format!("bloomfilter/{name}"));

let filter_bits = [1 << 10, 1 << 14, 1 << 17, 1 << 20]; // 1024, 16384, 131072, 1048576
let hashers = [3, 7, 10];
let item_size = 32;
let num_items = 1_000;

let mut rng = StdRng::seed_from_u64(42);

for &bits in &filter_bits {
for &k in &hashers {
let mut bf = BloomFilter::new(NZU8!(k), NZUsize!(bits));
let mut set = HashSet::new();

// Insert items
let inserted: Vec<_> = (0..num_items)
.map(|_| {
let mut item = vec![0u8; item_size];
rng.fill_bytes(&mut item);
bf.insert(&item);
set.insert(item.clone());
item
})
.collect();

// Items to query: inserted ones or guaranteed non-inserted ones
let items = if query_inserted {
inserted
} else {
let mut items = Vec::with_capacity(num_items);
while items.len() < num_items {
let mut item = vec![0u8; item_size];
rng.fill_bytes(&mut item);
if !set.contains(&item) {
items.push(item);
}
}
items
};

group.throughput(Throughput::Elements(1));
group.bench_with_input(
BenchmarkId::new(format!("bits={bits}"), format!("k={k}")),
&items,
|b, items| {
let mut idx = 0;
b.iter(|| {
let result = bf.contains(&items[idx]);
idx = (idx + 1) % items.len();
result
});
},
);
}
}

group.finish();
}

fn benchmark_contains_positive(c: &mut Criterion) {
benchmark_contains(c, "contains_positive", true);
}

fn benchmark_contains_negative(c: &mut Criterion) {
benchmark_contains(c, "contains_negative", false);
}

criterion_group!(
benches,
benchmark_contains_positive,
benchmark_contains_negative
);
Loading
Loading