Execution — How to Build and Run
Quick start (per language)
# Rust
cd src/rust
cargo build --release
cargo test --release
./target/release/bloombench --help
# Go
cd src/go
go test ./...
go build -o bin/bloombench ./cmd/bloombench
./bin/bloombench --help
# C++
cd src/cpp
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build
ctest --test-dir build
./build/bloombench --help
CLI: bloombench
A single binary per language. Subcommands have the same shape across all three so cross-language tests can shell out polyglot.
| Subcommand | Args | Behaviour |
|---|---|---|
hash STR | one string | Print fnv1a64=… splitmix=… h1=… h2=… for the given input |
build PATH N FPR | output path, key count, target FPR | Insert keys key0..key{N-1} and write the filter to PATH |
query PATH KEY | filter path, key | Print present or absent for one key |
query-file PATH KEYS_FILE | filter path, file with one key per line | Print results for each |
fpr-test PATH N M | filter path (built with N keys), M random absent keys | Measure FPR and print observed vs theoretical |
Library API
fnv1a64(bytes) -> u64
splitmix64(u64) -> u64
mix64(bytes) -> u64 // = splitmix64(fnv1a64(bytes))
BloomFilter::new(m_bits, k) -> Bloom
BloomFilter::with_fpr(n, fpr) -> Bloom
- picks m, k optimally; caps k at 30
Bloom::add(bytes)
Bloom::contains(bytes) -> bool
Bloom::k(), Bloom::m_bits(), Bloom::m_bytes()
Bloom::encode() -> Vec<u8> // header || bits
Bloom::decode(bytes) -> Bloom // inverse, validates header
On-disk / on-wire layout
┌─────────┬─────────┬─────────────────────────┐
│ k (u32) │ m (u64) │ bits ⌈m/8⌉ bytes │
│ │ │ bit i = bytes[i/8] >> (i mod 8) & 1
└─────────┴─────────┴─────────────────────────┘
4 8 ⌈m/8⌉
All integers little-endian. No padding. No internal checksum.
Verifying
./scripts/verify.sh # per-language unit + property tests
./scripts/cross_test.sh # writer/reader cross-product over {go,rust,cpp}