commit plain_hasher to util
This commit is contained in:
parent
e0c2995f78
commit
752dad6829
6
Cargo.lock
generated
6
Cargo.lock
generated
@ -548,7 +548,7 @@ dependencies = [
|
||||
"bigint 4.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"plain_hasher 0.1.0",
|
||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
@ -2201,9 +2201,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
[[package]]
|
||||
name = "plain_hasher"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"crunchy 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"crunchy 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3394,7 +3393,6 @@ dependencies = [
|
||||
"checksum phf_generator 0.7.14 (registry+https://github.com/rust-lang/crates.io-index)" = "db005608fd99800c8c74106a7c894cf582055b689aa14a79462cefdcb7dc1cc3"
|
||||
"checksum phf_shared 0.7.14 (registry+https://github.com/rust-lang/crates.io-index)" = "fee4d039930e4f45123c9b15976cf93a499847b6483dc09c42ea0ec4940f2aa6"
|
||||
"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903"
|
||||
"checksum plain_hasher 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "83ae80873992f511142c07d0ec6c44de5636628fdb7e204abd655932ea79d995"
|
||||
"checksum podio 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e5422a1ee1bc57cc47ae717b0137314258138f38fd5f3cea083f43a9725383a0"
|
||||
"checksum pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2412f3332a07c7a2a50168988dcc184f32180a9758ad470390e5f55e089f6b6e"
|
||||
"checksum primal 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0e31b86efadeaeb1235452171a66689682783149a6249ff334a2c5d8218d00a4"
|
||||
|
@ -13,7 +13,7 @@ rustc-hex = "1.0"
|
||||
rand = "0.3.12"
|
||||
libc = "0.2"
|
||||
heapsize = { version = "0.4", optional = true }
|
||||
plain_hasher = "0.1"
|
||||
plain_hasher = { path = "../plain_hasher" }
|
||||
|
||||
[features]
|
||||
x64asm_arithmetic=[]
|
||||
|
12
util/plain_hasher/Cargo.toml
Normal file
12
util/plain_hasher/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
||||
[package]
|
||||
name = "plain_hasher"
|
||||
description = "Hasher for 32-bit keys."
|
||||
version = "0.1.0"
|
||||
authors = ["Parity Technologies <admin@parity.io>"]
|
||||
license = "MIT"
|
||||
keywords = ["hash", "hasher"]
|
||||
categories = ["no-std"]
|
||||
homepage = "https://github.com/paritytech/plain_hasher"
|
||||
|
||||
[dependencies]
|
||||
crunchy = "0.1.6"
|
33
util/plain_hasher/benches/bench.rs
Normal file
33
util/plain_hasher/benches/bench.rs
Normal file
@ -0,0 +1,33 @@
|
||||
#![feature(test)]
|
||||
|
||||
extern crate test;
|
||||
extern crate plain_hasher;
|
||||
|
||||
use std::hash::Hasher;
|
||||
use std::collections::hash_map::DefaultHasher;
|
||||
use test::{Bencher, black_box};
|
||||
use plain_hasher::PlainHasher;
|
||||
|
||||
#[bench]
|
||||
fn write_plain_hasher(b: &mut Bencher) {
|
||||
b.iter(|| {
|
||||
let n: u8 = black_box(100);
|
||||
(0..n).fold(PlainHasher::default(), |mut old, new| {
|
||||
let bb = black_box([new; 32]);
|
||||
old.write(&bb as &[u8]);
|
||||
old
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
#[bench]
|
||||
fn write_default_hasher(b: &mut Bencher) {
|
||||
b.iter(|| {
|
||||
let n: u8 = black_box(100);
|
||||
(0..n).fold(DefaultHasher::default(), |mut old, new| {
|
||||
let bb = black_box([new; 32]);
|
||||
old.write(&bb as &[u8]);
|
||||
old
|
||||
});
|
||||
});
|
||||
}
|
55
util/plain_hasher/src/lib.rs
Normal file
55
util/plain_hasher/src/lib.rs
Normal file
@ -0,0 +1,55 @@
|
||||
#![no_std]
|
||||
#[macro_use]
|
||||
extern crate crunchy;
|
||||
|
||||
use core::{hash, mem};
|
||||
|
||||
/// Hasher that just takes 8 bytes of the provided value.
|
||||
/// May only be used for keys which are 32 bytes.
|
||||
#[derive(Default)]
|
||||
pub struct PlainHasher {
|
||||
prefix: u64,
|
||||
}
|
||||
|
||||
impl hash::Hasher for PlainHasher {
|
||||
#[inline]
|
||||
fn finish(&self) -> u64 {
|
||||
self.prefix
|
||||
}
|
||||
|
||||
#[inline]
|
||||
#[allow(unused_assignments)]
|
||||
fn write(&mut self, bytes: &[u8]) {
|
||||
debug_assert!(bytes.len() == 32);
|
||||
|
||||
unsafe {
|
||||
let mut bytes_ptr = bytes.as_ptr();
|
||||
let prefix_u8: &mut [u8; 8] = mem::transmute(&mut self.prefix);
|
||||
let mut prefix_ptr = prefix_u8.as_mut_ptr();
|
||||
|
||||
unroll! {
|
||||
for _i in 0..8 {
|
||||
*prefix_ptr ^= (*bytes_ptr ^ *bytes_ptr.offset(8)) ^ (*bytes_ptr.offset(16) ^ *bytes_ptr.offset(24));
|
||||
|
||||
bytes_ptr = bytes_ptr.offset(1);
|
||||
prefix_ptr = prefix_ptr.offset(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use core::hash::Hasher;
|
||||
use super::PlainHasher;
|
||||
|
||||
#[test]
|
||||
fn it_works() {
|
||||
let mut bytes = [32u8; 32];
|
||||
bytes[0] = 15;
|
||||
let mut hasher = PlainHasher::default();
|
||||
hasher.write(&bytes);
|
||||
assert_eq!(hasher.prefix, 47);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user