From 382dc3da858949e9efb7025db31b9f1e7af31bab Mon Sep 17 00:00:00 2001 From: Felix Stegmaier Date: Sun, 10 Feb 2019 16:32:31 +0100 Subject: [PATCH 1/2] Implement Hash for Queue --- src/spsc/mod.rs | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/src/spsc/mod.rs b/src/spsc/mod.rs index 00dfc12d..19c0e292 100644 --- a/src/spsc/mod.rs +++ b/src/spsc/mod.rs @@ -2,9 +2,10 @@ use core::cell::UnsafeCell; use core::marker::PhantomData; -use core::{ptr, fmt}; +use core::{ptr, fmt, hash}; use generic_array::{ArrayLength, GenericArray}; +use hash32; pub use self::split::{Consumer, Producer}; use __core::mem::MaybeUninit; @@ -228,6 +229,37 @@ where } } +impl hash::Hash for Queue +where + N: ArrayLength, + T: hash::Hash, + U: sealed::Uxx, + C: sealed::XCore, +{ + fn hash(&self, state: &mut H) { + // iterate over self in order + for t in self.iter() { + hash::Hash::hash(t, state); + } + } +} + +impl hash32::Hash for Queue +where + N: ArrayLength, + T: hash32::Hash, + U: sealed::Uxx, + C: sealed::XCore, +{ + fn hash(&self, state: &mut H) { + // iterate over self in order + for t in self.iter() { + hash32::Hash::hash(t, state); + } + } +} + + impl<'a, T, N, U, C> IntoIterator for &'a Queue where N: ArrayLength, @@ -644,4 +676,5 @@ mod tests { assert_eq!(c.ready(), false); assert_eq!(p.ready(), true); } + } From 681f4ef2e1c65d614f2e51e72ea42ba8ef69b97e Mon Sep 17 00:00:00 2001 From: Felix Stegmaier Date: Sun, 10 Feb 2019 16:49:36 +0100 Subject: [PATCH 2/2] Add test for hash equality of Queue --- src/spsc/mod.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/spsc/mod.rs b/src/spsc/mod.rs index 19c0e292..ddc2906b 100644 --- a/src/spsc/mod.rs +++ b/src/spsc/mod.rs @@ -517,6 +517,7 @@ iterator!(struct IterMut -> &'a mut T, *mut T, get_mut, as_mut_ptr, make_ref_mut mod tests { use consts::*; use spsc::Queue; + use hash32::Hasher; #[cfg(feature = "const-fn")] #[test] @@ -677,4 +678,37 @@ mod tests { assert_eq!(p.ready(), true); } + #[test] + fn hash_equality() { + // generate two queues with same content + // but different buffer alignment + let rb1 = { + let mut rb1: Queue = Queue::new(); + rb1.enqueue(0).unwrap(); + rb1.enqueue(0).unwrap(); + rb1.dequeue().unwrap(); + rb1.enqueue(0).unwrap(); + rb1 + }; + let rb2 = { + let mut rb2: Queue = Queue::new(); + rb2.enqueue(0).unwrap(); + rb2.enqueue(0).unwrap(); + rb2 + }; + let hash1 = { + let mut hasher1 = hash32::FnvHasher::default(); + hash32::Hash::hash(&rb1, &mut hasher1); + let hash1 = hasher1.finish(); + hash1 + }; + let hash2 = { + let mut hasher2 = hash32::FnvHasher::default(); + hash32::Hash::hash(&rb2, &mut hasher2); + let hash2 = hasher2.finish(); + hash2 + }; + assert_eq!(hash1, hash2); + } + }