diff --git a/Cargo.lock b/Cargo.lock index 8c00acfba..fa48eafcd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -319,6 +319,9 @@ dependencies = [ [[package]] name = "ethcore-bloom-journal" version = "0.1.0" +dependencies = [ + "siphasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "ethcore-dapps" @@ -1568,6 +1571,11 @@ dependencies = [ "gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "siphasher" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "slab" version = "0.1.3" @@ -2048,6 +2056,7 @@ dependencies = [ "checksum serde_codegen_internals 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f877e2781ed0a323295d1c9f0e26556117b5a11489fc47b1848dfb98b3173d21" "checksum serde_json 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e10f8a9d94b06cf5d3bef66475f04c8ff90950f1be7004c357ff9472ccbaebc" "checksum sha1 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cc30b1e1e8c40c121ca33b86c23308a090d19974ef001b4bf6e61fd1a0fb095c" +"checksum siphasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "5c44e42fa187b5a8782489cf7740cc27c3125806be2bf33563cf5e02e9533fcd" "checksum slab 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d807fd58c4181bbabed77cb3b891ba9748241a552bcc5be698faaebefc54f46e" "checksum slab 0.2.0 (git+https://github.com/carllerche/slab?rev=5476efcafb)" = "" "checksum slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6dbdd334bd28d328dad1c41b0ea662517883d8880d8533895ef96c8003dec9c4" diff --git a/util/bloom/Cargo.toml b/util/bloom/Cargo.toml index 5397c691b..c1d6f7638 100644 --- a/util/bloom/Cargo.toml +++ b/util/bloom/Cargo.toml @@ -7,3 +7,6 @@ license = "GPL3" [lib] path = "src/lib.rs" + +[dependencies] +siphasher = "0.1.1" diff --git a/util/bloom/src/lib.rs b/util/bloom/src/lib.rs index a4c0aff01..d5451f721 100644 --- a/util/bloom/src/lib.rs +++ b/util/bloom/src/lib.rs @@ -14,12 +14,18 @@ // You should have received a copy of the GNU General Public License // along with Parity. If not, see . + +extern crate siphasher; + use std::cmp; use std::mem; use std::f64; -use std::hash::{Hash, Hasher, BuildHasher}; -use std::collections::hash_map::RandomState; +use std::hash::{Hash, Hasher}; use std::collections::HashSet; +use siphasher::sip::SipHasher; + +// TODO [ToDr] Both hashers are exactly the same - no point to keep two. +const NUMBER_OF_HASHERS: usize = 2; /// BitVec structure with journalling /// Every time any of the blocks is getting set it's index is tracked @@ -74,7 +80,8 @@ pub struct Bloom { bitmap: BitVecJournal, bitmap_bits: u64, k_num: u32, - sips: [RandomState; 2], + // TODO [ToDr] Both hashers are exactly the same - no point to keep two. + sips: [SipHasher; NUMBER_OF_HASHERS], } impl Bloom { @@ -86,7 +93,7 @@ impl Bloom { let bitmap_bits = (bitmap_size as u64) * 8u64; let k_num = Bloom::optimal_k_num(bitmap_bits, items_count); let bitmap = BitVecJournal::new(bitmap_bits as usize); - let sips = [RandomState::default(), RandomState::default()]; + let sips = [SipHasher::new(), SipHasher::new()]; Bloom { bitmap: bitmap, bitmap_bits: bitmap_bits, @@ -100,7 +107,7 @@ impl Bloom { let bitmap_size = parts.len() * 8; let bitmap_bits = (bitmap_size as u64) * 8u64; let bitmap = BitVecJournal::from_parts(parts); - let sips = [RandomState::default(), RandomState::default()]; + let sips = [SipHasher::new(), SipHasher::new()]; Bloom { bitmap: bitmap, bitmap_bits: bitmap_bits, @@ -171,11 +178,11 @@ impl Bloom { cmp::max(k_num, 1) } - fn bloom_hash(&self, hashes: &mut [u64; 2], item: &T, k_i: u32) -> u64 + fn bloom_hash(&self, hashes: &mut [u64; NUMBER_OF_HASHERS], item: &T, k_i: u32) -> u64 where T: Hash { - if k_i < 2 { - let mut sip = self.sips[k_i as usize].build_hasher(); + if k_i < NUMBER_OF_HASHERS as u32 { + let mut sip = self.sips[k_i as usize].clone(); item.hash(&mut sip); let hash = sip.finish(); hashes[k_i as usize] = hash;