#![cfg_attr(test, feature(test))]
pub extern crate test;
#[cfg(feature = "fnv")]
pub extern crate fnv;
#[cfg(feature = "twox-hash")]
pub extern crate twox_hash;
extern crate metrohash;
pub use std::hash::Hasher;
pub use std::hash::SipHasher;
pub fn hasher_bench<H>(b: &mut test::Bencher, len: usize)
where H: Hasher + Default
{
let bytes: Vec<_> = (0..100).cycle().take(len).collect();
b.bytes = bytes.len() as u64;
b.iter(|| {
let mut hasher: H = Default::default();
hasher.write(&bytes);
hasher.finish()
});
}
macro_rules! impl_bench {
($mod_name: ident, $hasher: ty) => (
mod $mod_name {
use super::*;
#[bench]
fn hash_256_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 256)
}
#[bench]
fn hash_128_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 128)
}
#[bench]
fn hash_032_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 32)
}
#[bench]
fn hash_016_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 16)
}
#[bench]
fn hash_009_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 9)
}
#[bench]
fn hash_008_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 8)
}
#[bench]
fn hash_007_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 7)
}
#[bench]
fn hash_004_bytes(b: &mut test::Bencher) {
hasher_bench::<$hasher>(b, 4)
}
}
);
}
impl_bench!(std_sip, SipHasher);
impl_bench!(metro64, metrohash::MetroHash64);
#[cfg(feature = "fnv")]
impl_bench!(fnvh, fnv::FnvHasher);
#[cfg(feature = "twox-hash")]
impl_bench!(xxh, twox_hash::XxHash);