arnaucube
arnaucube/miden-cryptoPublic Self-hosted repository
miden-crypto/benches/hash.rs
benches/hash.rsRaw
 1
 2
 3use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion};
 4use miden_crypto::{hash::{Hasher, Digest}, HashFn, Felt, ElementHasher};
 5use rand_utils::rand_value;
 6
 7fn rpo256_2to1(c: &mut Criterion) {
 8    let v: [Digest; 2] = [Hasher::hash(&[1u8]), Hasher::hash(&[2u8])];
 9    c.bench_function("RPO256 2-to-1 hashing (cached)", |bench| {
10        bench.iter(|| Hasher::merge(black_box(&v)))
11    });
12
13    c.bench_function("RPO256 2-to-1 hashing (random)", |bench| {
14        bench.iter_batched(
15            || {
16                [
17                    Hasher::hash(&rand_value::<u64>().to_le_bytes()),
18                    Hasher::hash(&rand_value::<u64>().to_le_bytes()),
19                ]
20            },
21            |state| Hasher::merge(&state),
22            BatchSize::SmallInput,
23        )
24    });
25}
26
27fn rpo256_sequential(c: &mut Criterion) {
28    let v: [Felt; 100] = (0..100)
29        .into_iter()
30        .map(Felt::new)
31        .collect::<Vec<Felt>>()
32        .try_into()
33        .expect("should not fail");
34    c.bench_function("RPO256 sequential hashing (cached)", |bench| {
35        bench.iter(|| Hasher::hash_elements(black_box(&v)))
36    });
37
38    c.bench_function("RPO256 sequential hashing (random)", |bench| {
39        bench.iter_batched(
40            || {
41                let v: [Felt; 100] = (0..100)
42                    .into_iter()
43                    .map(|_| Felt::new(rand_value()))
44                    .collect::<Vec<Felt>>()
45                    .try_into()
46                    .expect("should not fail");
47                v
48            },
49            |state| Hasher::hash_elements(&state),
50            BatchSize::SmallInput,
51        )
52    });
53}
54
55criterion_group!(hash_group, rpo256_sequential, rpo256_2to1);
56criterion_main!(hash_group);