From db1b1919baba8be48d997d9f70a6a5df7e31612a Mon Sep 17 00:00:00 2001 From: Sean McArthur Date: Tue, 21 Jun 2016 14:27:15 -0700 Subject: std: use siphash-1-3 for HashMap --- src/libstd/collections/hash/map.rs | 28 ++++++++++++++++++++++++---- src/libstd/lib.rs | 1 + 2 files changed, 25 insertions(+), 4 deletions(-) (limited to 'src/libstd') diff --git a/src/libstd/collections/hash/map.rs b/src/libstd/collections/hash/map.rs index 536f168e401..60d7e01d988 100644 --- a/src/libstd/collections/hash/map.rs +++ b/src/libstd/collections/hash/map.rs @@ -14,7 +14,7 @@ use self::VacantEntryState::*; use borrow::Borrow; use cmp::max; use fmt::{self, Debug}; -use hash::{Hash, SipHasher, BuildHasher}; +use hash::{Hash, Hasher, BuildHasher, SipHasher13}; use iter::FromIterator; use mem::{self, replace}; use ops::{Deref, Index}; @@ -1711,10 +1711,30 @@ impl RandomState { #[stable(feature = "hashmap_build_hasher", since = "1.7.0")] impl BuildHasher for RandomState { - type Hasher = SipHasher; + type Hasher = DefaultHasher; #[inline] - fn build_hasher(&self) -> SipHasher { - SipHasher::new_with_keys(self.k0, self.k1) + fn build_hasher(&self) -> DefaultHasher { + DefaultHasher(SipHasher13::new_with_keys(self.k0, self.k1)) + } +} + +/// The default `Hasher` used by `RandomState`. +/// +/// The internal algorithm is not specified, and so it and its hashes should +/// not be relied upon over releases. +#[unstable(feature = "hashmap_default_hasher", issue = "0")] +pub struct DefaultHasher(SipHasher13); + +#[unstable(feature = "hashmap_default_hasher", issue = "0")] +impl Hasher for DefaultHasher { + #[inline] + fn write(&mut self, msg: &[u8]) { + self.0.write(msg) + } + + #[inline] + fn finish(&self) -> u64 { + self.0.finish() } } diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 135ea8a5e7c..a396c7be09a 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -255,6 +255,7 @@ #![feature(reflect_marker)] #![feature(rustc_attrs)] #![feature(shared)] +#![feature(sip_hash_13)] #![feature(slice_bytes)] #![feature(slice_concat_ext)] #![feature(slice_patterns)] -- cgit 1.4.1-3-g733a5