Rollup merge of #86140 - scottmcm:array-hash-facepalm, r=kennytm
Mention the `Borrow` guarantee on the `Hash` implementations for Arrays and `Vec` To remind people like me who forget about it and send PRs to make them different, and to (probably) get a test failure if the code is changed to no longer uphold it.
This commit is contained in:
commit
b1fb32d165
2 changed files with 34 additions and 0 deletions
|
@ -2407,6 +2407,23 @@ impl<T: Clone, A: Allocator + Clone> Clone for Vec<T, A> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The hash of a vector is the same as that of the corresponding slice,
|
||||||
|
/// as required by the `core::borrow::Borrow` implementation.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::hash::{BuildHasher, Hash, Hasher};
|
||||||
|
///
|
||||||
|
/// fn hash_of(x: impl Hash, b: &impl BuildHasher) -> u64 {
|
||||||
|
/// let mut h = b.build_hasher();
|
||||||
|
/// x.hash(&mut h);
|
||||||
|
/// h.finish()
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// let b = std::collections::hash_map::RandomState::new();
|
||||||
|
/// let v: Vec<u8> = vec![0xa8, 0x3c, 0x09];
|
||||||
|
/// let s: &[u8] = &[0xa8, 0x3c, 0x09];
|
||||||
|
/// assert_eq!(hash_of(v, &b), hash_of(s, &b));
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Hash, A: Allocator> Hash for Vec<T, A> {
|
impl<T: Hash, A: Allocator> Hash for Vec<T, A> {
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
|
@ -139,6 +139,23 @@ impl<'a, T, const N: usize> TryFrom<&'a mut [T]> for &'a mut [T; N] {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// The hash of an array is the same as that of the corresponding slice,
|
||||||
|
/// as required by the `Borrow` implementation.
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// use std::hash::{BuildHasher, Hash, Hasher};
|
||||||
|
///
|
||||||
|
/// fn hash_of(x: impl Hash, b: &impl BuildHasher) -> u64 {
|
||||||
|
/// let mut h = b.build_hasher();
|
||||||
|
/// x.hash(&mut h);
|
||||||
|
/// h.finish()
|
||||||
|
/// }
|
||||||
|
///
|
||||||
|
/// let b = std::collections::hash_map::RandomState::new();
|
||||||
|
/// let a: [u8; 3] = [0xa8, 0x3c, 0x09];
|
||||||
|
/// let s: &[u8] = &[0xa8, 0x3c, 0x09];
|
||||||
|
/// assert_eq!(hash_of(a, &b), hash_of(s, &b));
|
||||||
|
/// ```
|
||||||
#[stable(feature = "rust1", since = "1.0.0")]
|
#[stable(feature = "rust1", since = "1.0.0")]
|
||||||
impl<T: Hash, const N: usize> Hash for [T; N] {
|
impl<T: Hash, const N: usize> Hash for [T; N] {
|
||||||
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue