Skip to content

Conversation

@andresilva
Copy link
Collaborator

@andresilva andresilva commented Jan 7, 2026

This PR makes the BloomFilter generic over Hasher, defaulting to Sha256.

To support practical bloom filter sizing, a new with_rate constructor computes the optimal number of bits and hash functions for a given expected number of items and target false positive rate. Internally, this uses Q16.16 fixed-point arithmetic to ensure deterministic results across platforms, important for determinism. This is the recommended way to construct bloom filters in most cases, as it automatically balances space efficiency against the desired accuracy.

The index calculation has been optimized to use 64-bit arithmetic instead of 128-bit, and the bit count is now always rounded up to the next power of two. This allows using a bitmask instead of modulo for index calculation, which is faster.

Benchmarks were added to measure that the optimizations above work as expected. They compare Sha256 and Blake3 performance across different item sizes (32, 2048, 4096 bytes) and false positive rates (10%, 0.1%).

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Jan 7, 2026

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
commonware-mcp cd4768f Jan 09 2026, 06:03 PM

@andresilva
Copy link
Collaborator Author

andresilva commented Jan 7, 2026

bloomfilter/insert/bits=1024/k=3
                        time:   [40.391 ns 40.404 ns 40.417 ns]
                        thrpt:  [24.742 Melem/s 24.750 Melem/s 24.758 Melem/s]
                 change:
                        time:   [−30.809% −30.484% −30.158%] (p = 0.00 < 0.05)
                        thrpt:  [+43.180% +43.851% +44.528%]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  5 (5.00%) high mild
bloomfilter/insert/bits=1024/k=7
                        time:   [43.699 ns 43.717 ns 43.736 ns]
                        thrpt:  [22.865 Melem/s 22.875 Melem/s 22.884 Melem/s]
                 change:
                        time:   [−39.031% −38.937% −38.831%] (p = 0.00 < 0.05)
                        thrpt:  [+63.481% +63.764% +64.016%]
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  2 (2.00%) high mild
  4 (4.00%) high severe
bloomfilter/insert/bits=1024/k=10
                        time:   [45.515 ns 45.558 ns 45.623 ns]
                        thrpt:  [21.919 Melem/s 21.950 Melem/s 21.971 Melem/s]
                 change:
                        time:   [−46.696% −46.623% −46.546%] (p = 0.00 < 0.05)
                        thrpt:  [+87.076% +87.347% +87.604%]
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  3 (3.00%) high mild
  3 (3.00%) high severe
bloomfilter/insert/bits=16384/k=3
                        time:   [40.449 ns 40.514 ns 40.587 ns]
                        thrpt:  [24.638 Melem/s 24.683 Melem/s 24.722 Melem/s]
                 change:
                        time:   [−29.597% −29.412% −29.236%] (p = 0.00 < 0.05)
                        thrpt:  [+41.316% +41.667% +42.040%]
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe
bloomfilter/insert/bits=16384/k=7
                        time:   [43.523 ns 43.568 ns 43.618 ns]
                        thrpt:  [22.926 Melem/s 22.953 Melem/s 22.977 Melem/s]
                 change:
                        time:   [−39.337% −39.262% −39.189%] (p = 0.00 < 0.05)
                        thrpt:  [+64.443% +64.641% +64.844%]
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe
bloomfilter/insert/bits=16384/k=10
                        time:   [45.355 ns 45.384 ns 45.425 ns]
                        thrpt:  [22.014 Melem/s 22.034 Melem/s 22.049 Melem/s]
                 change:
                        time:   [−47.265% −47.209% −47.157%] (p = 0.00 < 0.05)
                        thrpt:  [+89.239% +89.427% +89.628%]
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  2 (2.00%) low mild
  2 (2.00%) high mild
  2 (2.00%) high severe
bloomfilter/insert/bits=131072/k=3
                        time:   [40.402 ns 40.413 ns 40.425 ns]
                        thrpt:  [24.737 Melem/s 24.744 Melem/s 24.751 Melem/s]
                 change:
                        time:   [−29.999% −29.746% −29.505%] (p = 0.00 < 0.05)
                        thrpt:  [+41.855% +42.341% +42.856%]
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  1 (1.00%) low mild
  1 (1.00%) high mild
  7 (7.00%) high severe
bloomfilter/insert/bits=131072/k=7
                        time:   [43.615 ns 43.694 ns 43.778 ns]
                        thrpt:  [22.842 Melem/s 22.887 Melem/s 22.928 Melem/s]
                 change:
                        time:   [−39.905% −39.841% −39.754%] (p = 0.00 < 0.05)
                        thrpt:  [+65.986% +66.226% +66.404%]
                        Performance has improved.
Found 15 outliers among 100 measurements (15.00%)
  6 (6.00%) high mild
  9 (9.00%) high severe
bloomfilter/insert/bits=131072/k=10
                        time:   [45.569 ns 45.589 ns 45.614 ns]
                        thrpt:  [21.923 Melem/s 21.935 Melem/s 21.945 Melem/s]
                 change:
                        time:   [−46.359% −46.284% −46.214%] (p = 0.00 < 0.05)
                        thrpt:  [+85.923% +86.163% +86.424%]
                        Performance has improved.
Found 10 outliers among 100 measurements (10.00%)
  1 (1.00%) low mild
  5 (5.00%) high mild
  4 (4.00%) high severe
bloomfilter/insert/bits=1048576/k=3
                        time:   [40.513 ns 40.558 ns 40.604 ns]
                        thrpt:  [24.628 Melem/s 24.656 Melem/s 24.684 Melem/s]
                 change:
                        time:   [−28.461% −28.297% −28.137%] (p = 0.00 < 0.05)
                        thrpt:  [+39.155% +39.464% +39.783%]
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  5 (5.00%) high mild
  9 (9.00%) high severe
bloomfilter/insert/bits=1048576/k=7
                        time:   [43.640 ns 43.689 ns 43.748 ns]
                        thrpt:  [22.858 Melem/s 22.889 Melem/s 22.915 Melem/s]
                 change:
                        time:   [−39.496% −39.377% −39.258%] (p = 0.00 < 0.05)
                        thrpt:  [+64.630% +64.955% +65.279%]
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  5 (5.00%) high mild
  4 (4.00%) high severe
bloomfilter/insert/bits=1048576/k=10
                        time:   [45.445 ns 45.494 ns 45.553 ns]
                        thrpt:  [21.952 Melem/s 21.981 Melem/s 22.004 Melem/s]
                 change:
                        time:   [−46.431% −46.347% −46.262%] (p = 0.00 < 0.05)
                        thrpt:  [+86.089% +86.384% +86.675%]
                        Performance has improved.
Found 11 outliers among 100 measurements (11.00%)
  4 (4.00%) high mild
  7 (7.00%) high severe

bloomfilter/contains_positive/bits=1024/k=3
                        time:   [41.642 ns 41.679 ns 41.721 ns]
                        thrpt:  [23.969 Melem/s 23.993 Melem/s 24.014 Melem/s]
                 change:
                        time:   [−27.936% −27.888% −27.834%] (p = 0.00 < 0.05)
                        thrpt:  [+38.570% +38.673% +38.765%]
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  7 (7.00%) high mild
  7 (7.00%) high severe
bloomfilter/contains_positive/bits=1024/k=7
                        time:   [47.012 ns 47.066 ns 47.128 ns]
                        thrpt:  [21.219 Melem/s 21.247 Melem/s 21.271 Melem/s]
                 change:
                        time:   [−35.988% −35.901% −35.809%] (p = 0.00 < 0.05)
                        thrpt:  [+55.784% +56.009% +56.220%]
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  5 (5.00%) high mild
  4 (4.00%) high severe
bloomfilter/contains_positive/bits=1024/k=10
                        time:   [49.388 ns 49.477 ns 49.571 ns]
                        thrpt:  [20.173 Melem/s 20.212 Melem/s 20.248 Melem/s]
                 change:
                        time:   [−43.192% −43.085% −42.988%] (p = 0.00 < 0.05)
                        thrpt:  [+75.403% +75.702% +76.031%]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  3 (3.00%) high mild
  2 (2.00%) high severe
bloomfilter/contains_positive/bits=16384/k=3
                        time:   [41.653 ns 41.663 ns 41.673 ns]
                        thrpt:  [23.996 Melem/s 24.002 Melem/s 24.008 Melem/s]
                 change:
                        time:   [−28.029% −27.961% −27.902%] (p = 0.00 < 0.05)
                        thrpt:  [+38.701% +38.813% +38.945%]
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high severe
bloomfilter/contains_positive/bits=16384/k=7
                        time:   [47.005 ns 47.038 ns 47.077 ns]
                        thrpt:  [21.242 Melem/s 21.259 Melem/s 21.274 Melem/s]
                 change:
                        time:   [−35.908% −35.845% −35.780%] (p = 0.00 < 0.05)
                        thrpt:  [+55.714% +55.872% +56.026%]
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  1 (1.00%) low severe
  4 (4.00%) high mild
  3 (3.00%) high severe
bloomfilter/contains_positive/bits=16384/k=10
                        time:   [49.281 ns 49.320 ns 49.361 ns]
                        thrpt:  [20.259 Melem/s 20.276 Melem/s 20.292 Melem/s]
                 change:
                        time:   [−43.523% −43.385% −43.277%] (p = 0.00 < 0.05)
                        thrpt:  [+76.297% +76.631% +77.064%]
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  1 (1.00%) high mild
  1 (1.00%) high severe
bloomfilter/contains_positive/bits=131072/k=3
                        time:   [42.047 ns 42.066 ns 42.087 ns]
                        thrpt:  [23.760 Melem/s 23.772 Melem/s 23.783 Melem/s]
                 change:
                        time:   [−27.455% −27.428% −27.402%] (p = 0.00 < 0.05)
                        thrpt:  [+37.745% +37.795% +37.846%]
                        Performance has improved.
Found 10 outliers among 100 measurements (10.00%)
  4 (4.00%) low mild
  3 (3.00%) high mild
  3 (3.00%) high severe
bloomfilter/contains_positive/bits=131072/k=7
                        time:   [47.022 ns 47.039 ns 47.057 ns]
                        thrpt:  [21.251 Melem/s 21.259 Melem/s 21.267 Melem/s]
                 change:
                        time:   [−35.869% −35.816% −35.774%] (p = 0.00 < 0.05)
                        thrpt:  [+55.699% +55.801% +55.931%]
                        Performance has improved.
bloomfilter/contains_positive/bits=131072/k=10
                        time:   [49.371 ns 49.406 ns 49.446 ns]
                        thrpt:  [20.224 Melem/s 20.240 Melem/s 20.255 Melem/s]
                 change:
                        time:   [−42.935% −42.895% −42.858%] (p = 0.00 < 0.05)
                        thrpt:  [+75.004% +75.115% +75.239%]
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild
bloomfilter/contains_positive/bits=1048576/k=3
                        time:   [43.374 ns 43.381 ns 43.388 ns]
                        thrpt:  [23.048 Melem/s 23.052 Melem/s 23.055 Melem/s]
                 change:
                        time:   [−26.531% −26.496% −26.456%] (p = 0.00 < 0.05)
                        thrpt:  [+35.973% +36.048% +36.112%]
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  1 (1.00%) high mild
  5 (5.00%) high severe
bloomfilter/contains_positive/bits=1048576/k=7
                        time:   [47.998 ns 48.068 ns 48.149 ns]
                        thrpt:  [20.769 Melem/s 20.804 Melem/s 20.834 Melem/s]
                 change:
                        time:   [−35.413% −35.307% −35.192%] (p = 0.00 < 0.05)
                        thrpt:  [+54.301% +54.576% +54.829%]
                        Performance has improved.
Found 13 outliers among 100 measurements (13.00%)
  8 (8.00%) high mild
  5 (5.00%) high severe
bloomfilter/contains_positive/bits=1048576/k=10
                        time:   [50.670 ns 50.680 ns 50.692 ns]
                        thrpt:  [19.727 Melem/s 19.732 Melem/s 19.736 Melem/s]
                 change:
                        time:   [−42.869% −42.219% −41.861%] (p = 0.00 < 0.05)
                        thrpt:  [+72.002% +73.069% +75.036%]
                        Performance has improved.
Found 6 outliers among 100 measurements (6.00%)
  4 (4.00%) high mild
  2 (2.00%) high severe

bloomfilter/contains_negative/bits=1024/k=3
                        time:   [43.058 ns 43.077 ns 43.098 ns]
                        thrpt:  [23.203 Melem/s 23.214 Melem/s 23.224 Melem/s]
                 change:
                        time:   [−26.647% −26.561% −26.482%] (p = 0.00 < 0.05)
                        thrpt:  [+36.021% +36.168% +36.326%]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  4 (4.00%) high mild
  1 (1.00%) high severe
bloomfilter/contains_negative/bits=1024/k=7
                        time:   [47.186 ns 47.247 ns 47.311 ns]
                        thrpt:  [21.137 Melem/s 21.165 Melem/s 21.193 Melem/s]
                 change:
                        time:   [−35.912% −35.827% −35.740%] (p = 0.00 < 0.05)
                        thrpt:  [+55.617% +55.829% +56.036%]
                        Performance has improved.
Found 7 outliers among 100 measurements (7.00%)
  4 (4.00%) high mild
  3 (3.00%) high severe
bloomfilter/contains_negative/bits=1024/k=10
                        time:   [49.364 ns 49.404 ns 49.450 ns]
                        thrpt:  [20.222 Melem/s 20.241 Melem/s 20.258 Melem/s]
                 change:
                        time:   [−43.046% −42.970% −42.877%] (p = 0.00 < 0.05)
                        thrpt:  [+75.061% +75.345% +75.579%]
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  6 (6.00%) high mild
  6 (6.00%) high severe
bloomfilter/contains_negative/bits=16384/k=3
                        time:   [42.013 ns 42.042 ns 42.081 ns]
                        thrpt:  [23.764 Melem/s 23.785 Melem/s 23.802 Melem/s]
                 change:
                        time:   [−17.556% −17.466% −17.393%] (p = 0.00 < 0.05)
                        thrpt:  [+21.055% +21.163% +21.294%]
                        Performance has improved.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) low severe
  2 (2.00%) low mild
  3 (3.00%) high mild
  7 (7.00%) high severe
bloomfilter/contains_negative/bits=16384/k=7
                        time:   [43.877 ns 43.896 ns 43.920 ns]
                        thrpt:  [22.768 Melem/s 22.781 Melem/s 22.791 Melem/s]
                 change:
                        time:   [−20.675% −20.611% −20.555%] (p = 0.00 < 0.05)
                        thrpt:  [+25.873% +25.963% +26.063%]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  2 (2.00%) high mild
  3 (3.00%) high severe
bloomfilter/contains_negative/bits=16384/k=10
                        time:   [43.687 ns 43.741 ns 43.798 ns]
                        thrpt:  [22.832 Melem/s 22.862 Melem/s 22.890 Melem/s]
                 change:
                        time:   [−26.353% −26.296% −26.230%] (p = 0.00 < 0.05)
                        thrpt:  [+35.557% +35.678% +35.783%]
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  2 (2.00%) low mild
  3 (3.00%) high mild
  3 (3.00%) high severe
bloomfilter/contains_negative/bits=131072/k=3
                        time:   [40.870 ns 40.918 ns 40.974 ns]
                        thrpt:  [24.406 Melem/s 24.439 Melem/s 24.468 Melem/s]
                 change:
                        time:   [−16.501% −16.434% −16.367%] (p = 0.00 < 0.05)
                        thrpt:  [+19.570% +19.666% +19.762%]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  1 (1.00%) high mild
  4 (4.00%) high severe
bloomfilter/contains_negative/bits=131072/k=7
                        time:   [41.200 ns 41.235 ns 41.273 ns]
                        thrpt:  [24.229 Melem/s 24.251 Melem/s 24.272 Melem/s]
                 change:
                        time:   [−16.795% −16.704% −16.623%] (p = 0.00 < 0.05)
                        thrpt:  [+19.937% +20.054% +20.185%]
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  4 (4.00%) high mild
bloomfilter/contains_negative/bits=131072/k=10
                        time:   [41.587 ns 41.633 ns 41.680 ns]
                        thrpt:  [23.992 Melem/s 24.019 Melem/s 24.046 Melem/s]
                 change:
                        time:   [−16.894% −16.794% −16.699%] (p = 0.00 < 0.05)
                        thrpt:  [+20.046% +20.184% +20.328%]
                        Performance has improved.
Found 11 outliers among 100 measurements (11.00%)
  7 (7.00%) high mild
  4 (4.00%) high severe
bloomfilter/contains_negative/bits=1048576/k=3
                        time:   [41.906 ns 41.978 ns 42.060 ns]
                        thrpt:  [23.775 Melem/s 23.822 Melem/s 23.863 Melem/s]
                 change:
                        time:   [−15.590% −15.506% −15.410%] (p = 0.00 < 0.05)
                        thrpt:  [+18.217% +18.351% +18.469%]
                        Performance has improved.
Found 17 outliers among 100 measurements (17.00%)
  3 (3.00%) high mild
  14 (14.00%) high severe
bloomfilter/contains_negative/bits=1048576/k=7
                        time:   [41.948 ns 41.985 ns 42.028 ns]
                        thrpt:  [23.794 Melem/s 23.818 Melem/s 23.839 Melem/s]
                 change:
                        time:   [−15.738% −15.520% −15.352%] (p = 0.00 < 0.05)
                        thrpt:  [+18.136% +18.372% +18.678%]
                        Performance has improved.
Found 13 outliers among 100 measurements (13.00%)
  5 (5.00%) high mild
  8 (8.00%) high severe
bloomfilter/contains_negative/bits=1048576/k=10
                        time:   [41.879 ns 41.913 ns 41.953 ns]
                        thrpt:  [23.836 Melem/s 23.859 Melem/s 23.878 Melem/s]
                 change:
                        time:   [−15.703% −15.557% −15.399%] (p = 0.00 < 0.05)
                        thrpt:  [+18.202% +18.423% +18.628%]
                        Performance has improved.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe

///
/// The number of bits will be rounded up to the next power of 2.
pub fn new(hashers: NonZeroU8, bits: NonZeroUsize) -> Self {
let bits = bits.get().next_power_of_two();
Copy link
Collaborator Author

@andresilva andresilva Jan 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Decided to just round up to the next power of two rather than crashing here. Let me know if you prefer asserting.

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Jan 7, 2026

Deploying monorepo with  Cloudflare Pages  Cloudflare Pages

Latest commit: cd4768f
Status: ✅  Deploy successful!
Preview URL: https://85126068.monorepo-eu0.pages.dev
Branch Preview URL: https://andre-bloomfilter-improvemen.monorepo-eu0.pages.dev

View logs

@andresilva andresilva added the breaking-format This PR modifies codec and/or storage formats. label Jan 7, 2026
@andresilva andresilva force-pushed the andre/bloomfilter-improvements branch from 0ebf814 to 5589649 Compare January 7, 2026 19:03
@andresilva
Copy link
Collaborator Author

bugbot run

Copy link
Contributor

@patrick-ogrady patrick-ogrady left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Initial comments

// Extract two 64-bit hash values from the SHA256 digest of the item
let digest = Sha256::hash(item);
let h1 = u64::from_be_bytes(digest[0..8].try_into().unwrap());
let h2 = u64::from_be_bytes(digest[8..16].try_into().unwrap());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was the rationale for u64 instead? I opted for u128 for security.

Copy link
Collaborator Author

@andresilva andresilva Jan 7, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

u64 arithmetic is faster than u128. My rationale was that bloom filters do not rely on collision resistance or large hash domains. All entropy beyond log2(m) bits is discarded during indexing, so using u128 does not improve security or false-positive behavior. The cryptographic hash should already provide more than enough uniformity.

let digest = Sha256::hash(item);
let h1 = u64::from_be_bytes(digest[0..8].try_into().unwrap());
let mut h2 = u64::from_be_bytes(digest[8..16].try_into().unwrap());
h2 |= 1; // make sure h2 is non-zero
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You have to be the unluckiest person in the universe for this to happen, but the Kirsch-Mitzenmacher optimization assumes that h2 is non-zero.

@andresilva andresilva changed the title [cryptography/bloomfilter] make it faster [cryptography/bloomfilter] generic Hasher, optimal construction, and optimizations Jan 8, 2026
@andresilva andresilva changed the title [cryptography/bloomfilter] generic Hasher, optimal construction, and optimizations [cryptography/bloomfilter] generic Hasher and optimizations Jan 8, 2026
@andresilva
Copy link
Collaborator Author

I updated the benchmarks, here's a comparison of the impact of the optimizations:

bloomfilter::insert/sha256/size=32 fp=0.1
                        time:   [41.172 ns 41.196 ns 41.224 ns]
                        thrpt:  [24.258 Melem/s 24.274 Melem/s 24.288 Melem/s]
                 change:
                        time:   [−38.880% −38.500% −38.151%] (p = 0.00 < 0.05)
                        thrpt:  [+61.684% +62.602% +63.612%]
                        Performance has improved.
Found 16 outliers among 100 measurements (16.00%)
  9 (9.00%) high mild
  7 (7.00%) high severe
bloomfilter::insert/sha256/size=32 fp=0.001
                        time:   [53.950 ns 53.996 ns 54.044 ns]
                        thrpt:  [18.503 Melem/s 18.520 Melem/s 18.536 Melem/s]
                 change:
                        time:   [−56.179% −55.924% −55.758%] (p = 0.00 < 0.05)
                        thrpt:  [+126.03% +126.88% +128.20%]
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  6 (6.00%) high mild
  2 (2.00%) high severe
bloomfilter::insert/sha256/size=2048 fp=0.1
                        time:   [793.64 ns 793.91 ns 794.19 ns]
                        thrpt:  [1.2591 Melem/s 1.2596 Melem/s 1.2600 Melem/s]
                 change:
                        time:   [−3.3897% −2.9655% −2.7308%] (p = 0.00 < 0.05)
                        thrpt:  [+2.8075% +3.0561% +3.5086%]
                        Performance has improved.
Found 26 outliers among 100 measurements (26.00%)
  5 (5.00%) low severe
  6 (6.00%) low mild
  3 (3.00%) high mild
  12 (12.00%) high severe
bloomfilter::insert/sha256/size=2048 fp=0.001
                        time:   [809.67 ns 809.96 ns 810.27 ns]
                        thrpt:  [1.2342 Melem/s 1.2346 Melem/s 1.2351 Melem/s]
                 change:
                        time:   [−8.0961% −7.5141% −7.0595%] (p = 0.00 < 0.05)
                        thrpt:  [+7.5957% +8.1246% +8.8094%]
                        Performance has improved.
Found 22 outliers among 100 measurements (22.00%)
  1 (1.00%) low severe
  4 (4.00%) low mild
  1 (1.00%) high mild
  16 (16.00%) high severe
bloomfilter::insert/sha256/size=4096 fp=0.1
                        time:   [1.5473 µs 1.5483 µs 1.5495 µs]
                        thrpt:  [645.39 Kelem/s 645.86 Kelem/s 646.28 Kelem/s]
                 change:
                        time:   [−2.3374% −1.6613% −0.9253%] (p = 0.00 < 0.05)
                        thrpt:  [+0.9339% +1.6894% +2.3934%]
                        Change within noise threshold.
Found 22 outliers among 100 measurements (22.00%)
  1 (1.00%) low severe
  2 (2.00%) low mild
  4 (4.00%) high mild
  15 (15.00%) high severe
bloomfilter::insert/sha256/size=4096 fp=0.001
                        time:   [1.5621 µs 1.5628 µs 1.5637 µs]
                        thrpt:  [639.50 Kelem/s 639.86 Kelem/s 640.18 Kelem/s]
                 change:
                        time:   [−4.5635% −3.9346% −3.2569%] (p = 0.00 < 0.05)
                        thrpt:  [+3.3665% +4.0957% +4.7818%]
                        Performance has improved.
Found 21 outliers among 100 measurements (21.00%)
  1 (1.00%) low severe
  4 (4.00%) low mild
  16 (16.00%) high severe
bloomfilter::insert/blake3/size=32 fp=0.1
                        time:   [76.703 ns 76.760 ns 76.818 ns]
                        thrpt:  [13.018 Melem/s 13.028 Melem/s 13.037 Melem/s]
                 change:
                        time:   [−24.484% −23.717% −22.545%] (p = 0.00 < 0.05)
                        thrpt:  [+29.108% +31.091% +32.422%]
                        Performance has improved.
Found 25 outliers among 100 measurements (25.00%)
  8 (8.00%) low severe
  5 (5.00%) low mild
  3 (3.00%) high mild
  9 (9.00%) high severe
bloomfilter::insert/blake3/size=32 fp=0.001
                        time:   [88.219 ns 88.268 ns 88.324 ns]
                        thrpt:  [11.322 Melem/s 11.329 Melem/s 11.335 Melem/s]
                 change:
                        time:   [−42.294% −41.973% −41.781%] (p = 0.00 < 0.05)
                        thrpt:  [+71.766% +72.334% +73.293%]
                        Performance has improved.
Found 18 outliers among 100 measurements (18.00%)
  3 (3.00%) low mild
  2 (2.00%) high mild
  13 (13.00%) high severe
bloomfilter::insert/blake3/size=2048 fp=0.1
                        time:   [1.0689 µs 1.0693 µs 1.0698 µs]
                        thrpt:  [934.71 Kelem/s 935.15 Kelem/s 935.54 Kelem/s]
                 change:
                        time:   [−2.6402% −2.0036% −1.4019%] (p = 0.00 < 0.05)
                        thrpt:  [+1.4218% +2.0446% +2.7118%]
                        Performance has improved.
Found 27 outliers among 100 measurements (27.00%)
  2 (2.00%) low severe
  3 (3.00%) low mild
  2 (2.00%) high mild
  20 (20.00%) high severe
bloomfilter::insert/blake3/size=2048 fp=0.001
                        time:   [1.0806 µs 1.0812 µs 1.0818 µs]
                        thrpt:  [924.39 Kelem/s 924.92 Kelem/s 925.42 Kelem/s]
                 change:
                        time:   [−6.3468% −5.7948% −5.3992%] (p = 0.00 < 0.05)
                        thrpt:  [+5.7074% +6.1512% +6.7769%]
                        Performance has improved.
Found 18 outliers among 100 measurements (18.00%)
  2 (2.00%) low mild
  9 (9.00%) high mild
  7 (7.00%) high severe
bloomfilter::insert/blake3/size=4096 fp=0.1
                        time:   [1.1507 µs 1.1515 µs 1.1523 µs]
                        thrpt:  [867.87 Kelem/s 868.43 Kelem/s 869.06 Kelem/s]
                 change:
                        time:   [−2.1401% −1.4402% −0.7698%] (p = 0.00 < 0.05)
                        thrpt:  [+0.7757% +1.4613% +2.1869%]
                        Change within noise threshold.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high severe
bloomfilter::insert/blake3/size=4096 fp=0.001
                        time:   [1.1519 µs 1.1527 µs 1.1537 µs]
                        thrpt:  [866.76 Kelem/s 867.56 Kelem/s 868.16 Kelem/s]
                 change:
                        time:   [−6.5268% −6.0170% −5.7030%] (p = 0.00 < 0.05)
                        thrpt:  [+6.0479% +6.4022% +6.9826%]
                        Performance has improved.
Found 13 outliers among 100 measurements (13.00%)
  1 (1.00%) low mild
  6 (6.00%) high mild
  6 (6.00%) high severe

bloomfilter::contains/positive/sha256/size=32 fp=0.1
                        time:   [45.806 ns 45.832 ns 45.862 ns]
                        thrpt:  [21.804 Melem/s 21.819 Melem/s 21.831 Melem/s]
                 change:
                        time:   [−30.451% −29.979% −29.548%] (p = 0.00 < 0.05)
                        thrpt:  [+41.940% +42.815% +43.783%]
                        Performance has improved.
Found 20 outliers among 100 measurements (20.00%)
  2 (2.00%) low severe
  6 (6.00%) high mild
  12 (12.00%) high severe
bloomfilter::contains/positive/sha256/size=32 fp=0.001
                        time:   [57.129 ns 57.162 ns 57.200 ns]
                        thrpt:  [17.482 Melem/s 17.494 Melem/s 17.504 Melem/s]
                 change:
                        time:   [−53.074% −52.806% −52.641%] (p = 0.00 < 0.05)
                        thrpt:  [+111.15% +111.89% +113.10%]
                        Performance has improved.
Found 30 outliers among 100 measurements (30.00%)
  2 (2.00%) low severe
  4 (4.00%) low mild
  6 (6.00%) high mild
  18 (18.00%) high severe
bloomfilter::contains/positive/sha256/size=2048 fp=0.1
                        time:   [813.10 ns 813.57 ns 814.09 ns]
                        thrpt:  [1.2284 Melem/s 1.2292 Melem/s 1.2299 Melem/s]
                 change:
                        time:   [−2.1618% −1.5125% −0.8853%] (p = 0.00 < 0.05)
                        thrpt:  [+0.8932% +1.5357% +2.2095%]
                        Change within noise threshold.
Found 12 outliers among 100 measurements (12.00%)
  2 (2.00%) high mild
  10 (10.00%) high severe
bloomfilter::contains/positive/sha256/size=2048 fp=0.001
                        time:   [824.31 ns 824.66 ns 825.06 ns]
                        thrpt:  [1.2120 Melem/s 1.2126 Melem/s 1.2131 Melem/s]
                 change:
                        time:   [−7.3329% −6.6573% −5.9394%] (p = 0.00 < 0.05)
                        thrpt:  [+6.3145% +7.1321% +7.9131%]
                        Performance has improved.
Found 22 outliers among 100 measurements (22.00%)
  2 (2.00%) low mild
  1 (1.00%) high mild
  19 (19.00%) high severe
bloomfilter::contains/positive/sha256/size=4096 fp=0.1
                        time:   [1.5708 µs 1.5716 µs 1.5725 µs]
                        thrpt:  [635.92 Kelem/s 636.31 Kelem/s 636.63 Kelem/s]
                 change:
                        time:   [−1.6108% −1.1164% −0.8341%] (p = 0.00 < 0.05)
                        thrpt:  [+0.8411% +1.1290% +1.6371%]
                        Change within noise threshold.
Found 19 outliers among 100 measurements (19.00%)
  3 (3.00%) low severe
  2 (2.00%) low mild
  6 (6.00%) high mild
  8 (8.00%) high severe
bloomfilter::contains/positive/sha256/size=4096 fp=0.001
                        time:   [1.5807 µs 1.5811 µs 1.5816 µs]
                        thrpt:  [632.26 Kelem/s 632.46 Kelem/s 632.64 Kelem/s]
                 change:
                        time:   [−4.3181% −3.8177% −3.5394%] (p = 0.00 < 0.05)
                        thrpt:  [+3.6693% +3.9692% +4.5130%]
                        Performance has improved.
Found 16 outliers among 100 measurements (16.00%)
  1 (1.00%) low severe
  5 (5.00%) low mild
  7 (7.00%) high mild
  3 (3.00%) high severe
bloomfilter::contains/positive/blake3/size=32 fp=0.1
                        time:   [81.356 ns 81.406 ns 81.462 ns]
                        thrpt:  [12.276 Melem/s 12.284 Melem/s 12.292 Melem/s]
                 change:
                        time:   [−18.721% −18.288% −18.045%] (p = 0.00 < 0.05)
                        thrpt:  [+22.019% +22.381% +23.033%]
                        Performance has improved.
Found 24 outliers among 100 measurements (24.00%)
  2 (2.00%) low severe
  4 (4.00%) low mild
  3 (3.00%) high mild
  15 (15.00%) high severe
bloomfilter::contains/positive/blake3/size=32 fp=0.001
                        time:   [91.910 ns 91.979 ns 92.055 ns]
                        thrpt:  [10.863 Melem/s 10.872 Melem/s 10.880 Melem/s]
                 change:
                        time:   [−39.618% −39.411% −39.097%] (p = 0.00 < 0.05)
                        thrpt:  [+64.197% +65.048% +65.613%]
                        Performance has improved.
Found 20 outliers among 100 measurements (20.00%)
  2 (2.00%) low mild
  7 (7.00%) high mild
  11 (11.00%) high severe
bloomfilter::contains/positive/blake3/size=2048 fp=0.1
                        time:   [1.0755 µs 1.0759 µs 1.0764 µs]
                        thrpt:  [929.01 Kelem/s 929.43 Kelem/s 929.80 Kelem/s]
                 change:
                        time:   [−1.7636% −1.7031% −1.6465%] (p = 0.00 < 0.05)
                        thrpt:  [+1.6741% +1.7326% +1.7953%]
                        Performance has improved.
Found 17 outliers among 100 measurements (17.00%)
  4 (4.00%) low mild
  2 (2.00%) high mild
  11 (11.00%) high severe
bloomfilter::contains/positive/blake3/size=2048 fp=0.001
                        time:   [1.0860 µs 1.0867 µs 1.0875 µs]
                        thrpt:  [919.52 Kelem/s 920.23 Kelem/s 920.84 Kelem/s]
                 change:
                        time:   [−6.0030% −5.3406% −4.6340%] (p = 0.00 < 0.05)
                        thrpt:  [+4.8592% +5.6419% +6.3863%]
                        Performance has improved.
Found 26 outliers among 100 measurements (26.00%)
  2 (2.00%) low severe
  4 (4.00%) low mild
  5 (5.00%) high mild
  15 (15.00%) high severe
bloomfilter::contains/positive/blake3/size=4096 fp=0.1
                        time:   [1.1451 µs 1.1459 µs 1.1468 µs]
                        thrpt:  [871.97 Kelem/s 872.68 Kelem/s 873.27 Kelem/s]
                 change:
                        time:   [−2.2365% −1.6156% −1.0983%] (p = 0.00 < 0.05)
                        thrpt:  [+1.1105% +1.6422% +2.2877%]
                        Performance has improved.
Found 14 outliers among 100 measurements (14.00%)
  6 (6.00%) high mild
  8 (8.00%) high severe
bloomfilter::contains/positive/blake3/size=4096 fp=0.001
                        time:   [1.1609 µs 1.1624 µs 1.1639 µs]
                        thrpt:  [859.20 Kelem/s 860.29 Kelem/s 861.41 Kelem/s]
                 change:
                        time:   [−5.6327% −5.0474% −4.6497%] (p = 0.00 < 0.05)
                        thrpt:  [+4.8765% +5.3157% +5.9689%]
                        Performance has improved.
Found 2 outliers among 100 measurements (2.00%)
  2 (2.00%) high severe

bloomfilter::contains/negative/sha256/size=32 fp=0.1
                        time:   [48.225 ns 48.258 ns 48.295 ns]
                        thrpt:  [20.706 Melem/s 20.722 Melem/s 20.736 Melem/s]
                 change:
                        time:   [−25.038% −24.627% −24.380%] (p = 0.00 < 0.05)
                        thrpt:  [+32.240% +32.674% +33.401%]
                        Performance has improved.
Found 9 outliers among 100 measurements (9.00%)
  5 (5.00%) high mild
  4 (4.00%) high severe
bloomfilter::contains/negative/sha256/size=32 fp=0.001
                        time:   [48.377 ns 48.394 ns 48.411 ns]
                        thrpt:  [20.656 Melem/s 20.664 Melem/s 20.671 Melem/s]
                 change:
                        time:   [−24.695% −24.169% −23.675%] (p = 0.00 < 0.05)
                        thrpt:  [+31.018% +31.873% +32.793%]
                        Performance has improved.
Found 16 outliers among 100 measurements (16.00%)
  2 (2.00%) low mild
  4 (4.00%) high mild
  10 (10.00%) high severe
bloomfilter::contains/negative/sha256/size=2048 fp=0.1
                        time:   [802.60 ns 802.91 ns 803.26 ns]
                        thrpt:  [1.2449 Melem/s 1.2455 Melem/s 1.2459 Melem/s]
                 change:
                        time:   [−1.6270% −1.5054% −1.3775%] (p = 0.00 < 0.05)
                        thrpt:  [+1.3967% +1.5284% +1.6539%]
                        Performance has improved.
Found 20 outliers among 100 measurements (20.00%)
  1 (1.00%) low severe
  3 (3.00%) low mild
  4 (4.00%) high mild
  12 (12.00%) high severe
bloomfilter::contains/negative/sha256/size=2048 fp=0.001
                        time:   [802.52 ns 803.02 ns 803.55 ns]
                        thrpt:  [1.2445 Melem/s 1.2453 Melem/s 1.2461 Melem/s]
                 change:
                        time:   [−1.8661% −1.4902% −1.2698%] (p = 0.00 < 0.05)
                        thrpt:  [+1.2862% +1.5128% +1.9016%]
                        Performance has improved.
Found 18 outliers among 100 measurements (18.00%)
  6 (6.00%) high mild
  12 (12.00%) high severe
bloomfilter::contains/negative/sha256/size=4096 fp=0.1
                        time:   [1.5571 µs 1.5582 µs 1.5595 µs]
                        thrpt:  [641.25 Kelem/s 641.75 Kelem/s 642.20 Kelem/s]
                 change:
                        time:   [−1.4037% −0.7559% −0.1736%] (p = 0.00 < 0.05)
                        thrpt:  [+0.1739% +0.7617% +1.4237%]
                        Change within noise threshold.
Found 16 outliers among 100 measurements (16.00%)
  2 (2.00%) low mild
  9 (9.00%) high mild
  5 (5.00%) high severe
bloomfilter::contains/negative/sha256/size=4096 fp=0.001
                        time:   [1.5550 µs 1.5557 µs 1.5567 µs]
                        thrpt:  [642.40 Kelem/s 642.78 Kelem/s 643.08 Kelem/s]
                 change:
                        time:   [−1.2686% −0.5937% +0.0591%] (p = 0.04 < 0.05)
                        thrpt:  [−0.0590% +0.5973% +1.2849%]
                        Change within noise threshold.
Found 19 outliers among 100 measurements (19.00%)
  3 (3.00%) low severe
  3 (3.00%) low mild
  1 (1.00%) high mild
  12 (12.00%) high severe
bloomfilter::contains/negative/blake3/size=32 fp=0.1
                        time:   [84.375 ns 84.409 ns 84.448 ns]
                        thrpt:  [11.842 Melem/s 11.847 Melem/s 11.852 Melem/s]
                 change:
                        time:   [−12.938% −12.320% −11.701%] (p = 0.00 < 0.05)
                        thrpt:  [+13.252% +14.051% +14.861%]
                        Performance has improved.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe
bloomfilter::contains/negative/blake3/size=32 fp=0.001
                        time:   [83.267 ns 83.301 ns 83.341 ns]
                        thrpt:  [11.999 Melem/s 12.005 Melem/s 12.010 Melem/s]
                 change:
                        time:   [−12.937% −12.702% −12.314%] (p = 0.00 < 0.05)
                        thrpt:  [+14.043% +14.550% +14.859%]
                        Performance has improved.
Found 18 outliers among 100 measurements (18.00%)
  3 (3.00%) low mild
  10 (10.00%) high mild
  5 (5.00%) high severe
bloomfilter::contains/negative/blake3/size=2048 fp=0.1
                        time:   [1.0785 µs 1.0790 µs 1.0796 µs]
                        thrpt:  [926.25 Kelem/s 926.79 Kelem/s 927.25 Kelem/s]
                 change:
                        time:   [−1.9777% −1.4664% −1.1822%] (p = 0.00 < 0.05)
                        thrpt:  [+1.1963% +1.4882% +2.0176%]
                        Performance has improved.
Found 28 outliers among 100 measurements (28.00%)
  8 (8.00%) low severe
  5 (5.00%) low mild
  1 (1.00%) high mild
  14 (14.00%) high severe
bloomfilter::contains/negative/blake3/size=2048 fp=0.001
                        time:   [1.0780 µs 1.0782 µs 1.0784 µs]
                        thrpt:  [927.27 Kelem/s 927.46 Kelem/s 927.62 Kelem/s]
                 change:
                        time:   [−2.0025% −1.3144% −0.6195%] (p = 0.00 < 0.05)
                        thrpt:  [+0.6234% +1.3319% +2.0434%]
                        Change within noise threshold.
Found 16 outliers among 100 measurements (16.00%)
  2 (2.00%) low severe
  5 (5.00%) low mild
  3 (3.00%) high mild
  6 (6.00%) high severe
bloomfilter::contains/negative/blake3/size=4096 fp=0.1
                        time:   [1.1614 µs 1.1621 µs 1.1628 µs]
                        thrpt:  [860.01 Kelem/s 860.48 Kelem/s 861.03 Kelem/s]
                 change:
                        time:   [−1.5176% −0.9806% −0.6441%] (p = 0.00 < 0.05)
                        thrpt:  [+0.6483% +0.9904% +1.5410%]
                        Change within noise threshold.
bloomfilter::contains/negative/blake3/size=4096 fp=0.001
                        time:   [1.1626 µs 1.1633 µs 1.1640 µs]
                        thrpt:  [859.12 Kelem/s 859.65 Kelem/s 860.11 Kelem/s]
                 change:
                        time:   [−1.1033% −0.6025% −0.2787%] (p = 0.00 < 0.05)
                        thrpt:  [+0.2795% +0.6061% +1.1156%]
                        Change within noise threshold.
Found 24 outliers among 100 measurements (24.00%)
  2 (2.00%) low severe
  3 (3.00%) low mild
  2 (2.00%) high mild
  17 (17.00%) high severe

The optimizations have a big impact for small inputs size, for larger inputs computing the hash will dominate. Either way, this is consistently faster on all benchmarks.

@andresilva andresilva force-pushed the andre/bloomfilter-improvements branch from dd56e19 to 700db56 Compare January 8, 2026 18:49
@andresilva
Copy link
Collaborator Author

bugbot run

@andresilva
Copy link
Collaborator Author

bugbot run

@codecov
Copy link

codecov bot commented Jan 9, 2026

Codecov Report

❌ Patch coverage is 98.98305% with 3 lines in your changes missing coverage. Please review.
✅ Project coverage is 93.27%. Comparing base (b09cca7) to head (cd4768f).
⚠️ Report is 21 commits behind head on main.

Files with missing lines Patch % Lines
cryptography/src/bloomfilter/mod.rs 98.98% 3 Missing ⚠️
@@            Coverage Diff             @@
##             main    #2729      +/-   ##
==========================================
+ Coverage   92.91%   93.27%   +0.36%     
==========================================
  Files         363      372       +9     
  Lines      108104   114877    +6773     
==========================================
+ Hits       100449   107157    +6708     
- Misses       7655     7720      +65     
Files with missing lines Coverage Δ
cryptography/src/bloomfilter/mod.rs 98.98% <98.98%> (ø)

... and 159 files with indirect coverage changes


Continue to review full report in Codecov by Sentry.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update b09cca7...cd4768f. Read the comment docs.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@andresilva andresilva moved this to Ready for Review in Tracker Jan 15, 2026
@andresilva andresilva self-assigned this Jan 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking-format This PR modifies codec and/or storage formats.

Projects

Status: Ready for Review

Development

Successfully merging this pull request may close these issues.

3 participants