1 use ahash::AHasher;
2 use criterion::*;
3 use fxhash::FxHasher;
4 use std::collections::hash_map::DefaultHasher;
5 use std::hash::{Hash, Hasher};
6 
7 #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes"))]
aeshash<H: Hash>(b: H) -> u648 fn aeshash<H: Hash>(b: H) -> u64 {
9     let mut hasher = AHasher::new_with_keys(1234, 5678);
10     b.hash(&mut hasher);
11     hasher.finish()
12 }
13 #[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes")))]
aeshash<H: Hash>(_b: H) -> u6414 fn aeshash<H: Hash>(_b: H) -> u64 {
15     panic!("aes must be enabled")
16 }
17 
18 #[cfg(not(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes")))]
fallbackhash<H: Hash>(b: H) -> u6419 fn fallbackhash<H: Hash>(b: H) -> u64 {
20     let mut hasher = AHasher::new_with_keys(1234, 5678);
21     b.hash(&mut hasher);
22     hasher.finish()
23 }
24 #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), target_feature = "aes"))]
fallbackhash<H: Hash>(_b: H) -> u6425 fn fallbackhash<H: Hash>(_b: H) -> u64 {
26     panic!("aes must be disabled")
27 }
28 
fnvhash<H: Hash>(b: H) -> u6429 fn fnvhash<H: Hash>(b: H) -> u64 {
30     let mut hasher = fnv::FnvHasher::default();
31     b.hash(&mut hasher);
32     hasher.finish()
33 }
34 
siphash<H: Hash>(b: H) -> u6435 fn siphash<H: Hash>(b: H) -> u64 {
36     let mut hasher = DefaultHasher::default();
37     b.hash(&mut hasher);
38     hasher.finish()
39 }
40 
fxhash<H: Hash>(b: H) -> u6441 fn fxhash<H: Hash>(b: H) -> u64 {
42     let mut hasher = FxHasher::default();
43     b.hash(&mut hasher);
44     hasher.finish()
45 }
46 
seahash<H: Hash>(b: H) -> u6447 fn seahash<H: Hash>(b: H) -> u64 {
48     let mut hasher = seahash::SeaHasher::default();
49     b.hash(&mut hasher);
50     hasher.finish()
51 }
52 
53 const STRING_LENGTHS: [u32; 11] = [1, 3, 4, 7, 8, 15, 16, 24, 68, 132, 1024];
54 
gen_strings() -> Vec<String>55 fn gen_strings() -> Vec<String> {
56     STRING_LENGTHS
57         .iter()
58         .map(|len| {
59             let mut string = String::default();
60             for pos in 1..=*len {
61                 let c = (48 + (pos % 10) as u8) as char;
62                 string.push(c);
63             }
64             string
65         })
66         .collect()
67 }
68 
69 const U8_VALUES: [u8; 1] = [8];
70 const U16_VALUES: [u16; 1] = [16];
71 const U32_VALUES: [u32; 1] = [32];
72 const U64_VALUES: [u64; 1] = [64];
73 const U128_VALUES: [u128; 1] = [128];
74 
bench_ahash(c: &mut Criterion)75 fn bench_ahash(c: &mut Criterion) {
76     c.bench(
77         "aeshash",
78         ParameterizedBenchmark::new("u8", |b, s| b.iter(|| black_box(aeshash(s))), &U8_VALUES),
79     );
80     c.bench(
81         "aeshash",
82         ParameterizedBenchmark::new("u16", |b, s| b.iter(|| black_box(aeshash(s))), &U16_VALUES),
83     );
84     c.bench(
85         "aeshash",
86         ParameterizedBenchmark::new("u32", |b, s| b.iter(|| black_box(aeshash(s))), &U32_VALUES),
87     );
88     c.bench(
89         "aeshash",
90         ParameterizedBenchmark::new("u64", |b, s| b.iter(|| black_box(aeshash(s))), &U64_VALUES),
91     );
92     c.bench(
93         "aeshash",
94         ParameterizedBenchmark::new("u128", |b, s| b.iter(|| black_box(aeshash(s))), &U128_VALUES),
95     );
96     c.bench(
97         "aeshash",
98         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(aeshash(s))), gen_strings()),
99     );
100 }
101 
bench_fallback(c: &mut Criterion)102 fn bench_fallback(c: &mut Criterion) {
103     c.bench(
104         "fallback",
105         ParameterizedBenchmark::new("u8", |b, s| b.iter(|| black_box(fallbackhash(s))), &U8_VALUES),
106     );
107     c.bench(
108         "fallback",
109         ParameterizedBenchmark::new("u16", |b, s| b.iter(|| black_box(fallbackhash(s))), &U16_VALUES),
110     );
111     c.bench(
112         "fallback",
113         ParameterizedBenchmark::new("u32", |b, s| b.iter(|| black_box(fallbackhash(s))), &U32_VALUES),
114     );
115     c.bench(
116         "fallback",
117         ParameterizedBenchmark::new("u64", |b, s| b.iter(|| black_box(fallbackhash(s))), &U64_VALUES),
118     );
119     c.bench(
120         "fallback",
121         ParameterizedBenchmark::new("u128", |b, s| b.iter(|| black_box(fallbackhash(s))), &U128_VALUES),
122     );
123     c.bench(
124         "fallback",
125         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(fallbackhash(s))), gen_strings()),
126     );
127 }
128 
bench_fx(c: &mut Criterion)129 fn bench_fx(c: &mut Criterion) {
130     c.bench(
131         "fx",
132         ParameterizedBenchmark::new("u8", |b, s| b.iter(|| black_box(fxhash(s))), &U8_VALUES),
133     );
134     c.bench(
135         "fx",
136         ParameterizedBenchmark::new("u16", |b, s| b.iter(|| black_box(fxhash(s))), &U16_VALUES),
137     );
138     c.bench(
139         "fx",
140         ParameterizedBenchmark::new("u32", |b, s| b.iter(|| black_box(fxhash(s))), &U32_VALUES),
141     );
142     c.bench(
143         "fx",
144         ParameterizedBenchmark::new("u64", |b, s| b.iter(|| black_box(fxhash(s))), &U64_VALUES),
145     );
146     c.bench(
147         "fx",
148         ParameterizedBenchmark::new("u128", |b, s| b.iter(|| black_box(fxhash(s))), &U128_VALUES),
149     );
150     c.bench(
151         "fx",
152         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(fxhash(s))), gen_strings()),
153     );
154 }
155 
bench_fnv(c: &mut Criterion)156 fn bench_fnv(c: &mut Criterion) {
157     c.bench(
158         "fnv",
159         ParameterizedBenchmark::new("u8", |b, s| b.iter(|| black_box(fnvhash(s))), &U8_VALUES),
160     );
161     c.bench(
162         "fnv",
163         ParameterizedBenchmark::new("u16", |b, s| b.iter(|| black_box(fnvhash(s))), &U16_VALUES),
164     );
165     c.bench(
166         "fnv",
167         ParameterizedBenchmark::new("u32", |b, s| b.iter(|| black_box(fnvhash(s))), &U32_VALUES),
168     );
169     c.bench(
170         "fnv",
171         ParameterizedBenchmark::new("u64", |b, s| b.iter(|| black_box(fnvhash(s))), &U64_VALUES),
172     );
173     c.bench(
174         "fnv",
175         ParameterizedBenchmark::new("u128", |b, s| b.iter(|| black_box(fnvhash(s))), &U128_VALUES),
176     );
177     c.bench(
178         "fnv",
179         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(fnvhash(s))), gen_strings()),
180     );
181 }
182 
bench_sea(c: &mut Criterion)183 fn bench_sea(c: &mut Criterion) {
184     c.bench(
185         "sea",
186         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(seahash(s))), gen_strings()),
187     );
188 }
189 
bench_sip(c: &mut Criterion)190 fn bench_sip(c: &mut Criterion) {
191     c.bench(
192         "sip",
193         ParameterizedBenchmark::new("u8", |b, s| b.iter(|| black_box(siphash(s))), &U8_VALUES),
194     );
195     c.bench(
196         "sip",
197         ParameterizedBenchmark::new("u16", |b, s| b.iter(|| black_box(siphash(s))), &U16_VALUES),
198     );
199     c.bench(
200         "sip",
201         ParameterizedBenchmark::new("u32", |b, s| b.iter(|| black_box(siphash(s))), &U32_VALUES),
202     );
203     c.bench(
204         "sip",
205         ParameterizedBenchmark::new("u64", |b, s| b.iter(|| black_box(siphash(s))), &U64_VALUES),
206     );
207     c.bench(
208         "sip",
209         ParameterizedBenchmark::new("u128", |b, s| b.iter(|| black_box(siphash(s))), &U128_VALUES),
210     );
211     c.bench(
212         "sip",
213         ParameterizedBenchmark::new("string", |b, s| b.iter(|| black_box(siphash(s))), gen_strings()),
214     );
215 }
216 
217 criterion_main!(benches);
218 criterion_group!(
219     benches,
220     bench_ahash,
221     bench_fallback,
222     bench_fx,
223     bench_fnv,
224     bench_sea,
225     bench_sip
226 );
227