mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 08:44:35 +00:00
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!(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