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