Add test stable hash uniqueness of adjacent field values
This commit is contained in:
parent
d2dc425721
commit
1ffd043caf
@ -98,3 +98,45 @@ fn test_hash_bit_matrix() {
|
|||||||
assert_ne!(a, b);
|
assert_ne!(a, b);
|
||||||
assert_ne!(hash(&a), hash(&b));
|
assert_ne!(hash(&a), hash(&b));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check that exchanging the value of two adjacent fields changes the hash.
|
||||||
|
#[test]
|
||||||
|
fn test_attribute_permutation() {
|
||||||
|
macro_rules! test_type {
|
||||||
|
($ty: ty) => {{
|
||||||
|
struct Foo {
|
||||||
|
a: $ty,
|
||||||
|
b: $ty,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<CTX> HashStable<CTX> for Foo {
|
||||||
|
fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) {
|
||||||
|
self.a.hash_stable(hcx, hasher);
|
||||||
|
self.b.hash_stable(hcx, hasher);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[allow(overflowing_literals)]
|
||||||
|
let mut item = Foo { a: 0xFF, b: 0xFF_FF };
|
||||||
|
let hash_a = hash(&item);
|
||||||
|
std::mem::swap(&mut item.a, &mut item.b);
|
||||||
|
let hash_b = hash(&item);
|
||||||
|
assert_ne!(
|
||||||
|
hash_a,
|
||||||
|
hash_b,
|
||||||
|
"The hash stayed the same after values were swapped for type `{}`!",
|
||||||
|
stringify!($ty)
|
||||||
|
);
|
||||||
|
}};
|
||||||
|
}
|
||||||
|
|
||||||
|
test_type!(u16);
|
||||||
|
test_type!(u32);
|
||||||
|
test_type!(u64);
|
||||||
|
test_type!(u128);
|
||||||
|
|
||||||
|
test_type!(i16);
|
||||||
|
test_type!(i32);
|
||||||
|
test_type!(i64);
|
||||||
|
test_type!(i128);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user