Using SipHasher from crates.io
This commit is contained in:
		
							parent
							
								
									5aadda95c3
								
							
						
					
					
						commit
						d3ae463a75
					
				
							
								
								
									
										9
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -319,6 +319,9 @@ dependencies = [ | |||||||
| [[package]] | [[package]] | ||||||
| name = "ethcore-bloom-journal" | name = "ethcore-bloom-journal" | ||||||
| version = "0.1.0" | version = "0.1.0" | ||||||
|  | dependencies = [ | ||||||
|  |  "siphasher 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", | ||||||
|  | ] | ||||||
| 
 | 
 | ||||||
| [[package]] | [[package]] | ||||||
| name = "ethcore-dapps" | name = "ethcore-dapps" | ||||||
| @ -1568,6 +1571,11 @@ dependencies = [ | |||||||
|  "gcc 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", |  "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]] | [[package]] | ||||||
| name = "slab" | name = "slab" | ||||||
| version = "0.1.3" | 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_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 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 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.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)" = "<none>" | "checksum slab 0.2.0 (git+https://github.com/carllerche/slab?rev=5476efcafb)" = "<none>" | ||||||
| "checksum slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6dbdd334bd28d328dad1c41b0ea662517883d8880d8533895ef96c8003dec9c4" | "checksum slab 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6dbdd334bd28d328dad1c41b0ea662517883d8880d8533895ef96c8003dec9c4" | ||||||
|  | |||||||
| @ -7,3 +7,6 @@ license = "GPL3" | |||||||
| 
 | 
 | ||||||
| [lib] | [lib] | ||||||
| path = "src/lib.rs" | path = "src/lib.rs" | ||||||
|  | 
 | ||||||
|  | [dependencies] | ||||||
|  | siphasher = "0.1.1" | ||||||
|  | |||||||
| @ -14,12 +14,18 @@ | |||||||
| // You should have received a copy of the GNU General Public License
 | // You should have received a copy of the GNU General Public License
 | ||||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | extern crate siphasher; | ||||||
|  | 
 | ||||||
| use std::cmp; | use std::cmp; | ||||||
| use std::mem; | use std::mem; | ||||||
| use std::f64; | use std::f64; | ||||||
| use std::hash::{Hash, Hasher, BuildHasher}; | use std::hash::{Hash, Hasher}; | ||||||
| use std::collections::hash_map::RandomState; |  | ||||||
| use std::collections::HashSet; | 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
 | /// BitVec structure with journalling
 | ||||||
| /// Every time any of the blocks is getting set it's index is tracked
 | /// Every time any of the blocks is getting set it's index is tracked
 | ||||||
| @ -74,7 +80,8 @@ pub struct Bloom { | |||||||
| 	bitmap: BitVecJournal, | 	bitmap: BitVecJournal, | ||||||
| 	bitmap_bits: u64, | 	bitmap_bits: u64, | ||||||
| 	k_num: u32, | 	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 { | impl Bloom { | ||||||
| @ -86,7 +93,7 @@ impl Bloom { | |||||||
| 		let bitmap_bits = (bitmap_size as u64) * 8u64; | 		let bitmap_bits = (bitmap_size as u64) * 8u64; | ||||||
| 		let k_num = Bloom::optimal_k_num(bitmap_bits, items_count); | 		let k_num = Bloom::optimal_k_num(bitmap_bits, items_count); | ||||||
| 		let bitmap = BitVecJournal::new(bitmap_bits as usize); | 		let bitmap = BitVecJournal::new(bitmap_bits as usize); | ||||||
| 		let sips = [RandomState::default(), RandomState::default()]; | 		let sips = [SipHasher::new(), SipHasher::new()]; | ||||||
| 		Bloom { | 		Bloom { | ||||||
| 			bitmap: bitmap, | 			bitmap: bitmap, | ||||||
| 			bitmap_bits: bitmap_bits, | 			bitmap_bits: bitmap_bits, | ||||||
| @ -100,7 +107,7 @@ impl Bloom { | |||||||
| 		let bitmap_size = parts.len() * 8; | 		let bitmap_size = parts.len() * 8; | ||||||
| 		let bitmap_bits = (bitmap_size as u64) * 8u64; | 		let bitmap_bits = (bitmap_size as u64) * 8u64; | ||||||
| 		let bitmap = BitVecJournal::from_parts(parts); | 		let bitmap = BitVecJournal::from_parts(parts); | ||||||
| 		let sips = [RandomState::default(), RandomState::default()]; | 		let sips = [SipHasher::new(), SipHasher::new()]; | ||||||
| 		Bloom { | 		Bloom { | ||||||
| 			bitmap: bitmap, | 			bitmap: bitmap, | ||||||
| 			bitmap_bits: bitmap_bits, | 			bitmap_bits: bitmap_bits, | ||||||
| @ -171,11 +178,11 @@ impl Bloom { | |||||||
| 		cmp::max(k_num, 1) | 		cmp::max(k_num, 1) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	fn bloom_hash<T>(&self, hashes: &mut [u64; 2], item: &T, k_i: u32) -> u64 | 	fn bloom_hash<T>(&self, hashes: &mut [u64; NUMBER_OF_HASHERS], item: &T, k_i: u32) -> u64 | ||||||
| 		where T: Hash | 		where T: Hash | ||||||
| 	{ | 	{ | ||||||
| 		if k_i < 2 { | 		if k_i < NUMBER_OF_HASHERS as u32 { | ||||||
| 			let mut sip = self.sips[k_i as usize].build_hasher(); | 			let mut sip = self.sips[k_i as usize].clone(); | ||||||
| 			item.hash(&mut sip); | 			item.hash(&mut sip); | ||||||
| 			let hash = sip.finish(); | 			let hash = sip.finish(); | ||||||
| 			hashes[k_i as usize] = hash; | 			hashes[k_i as usize] = hash; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user