Auto merge of #120076 - Mark-Simulacrum:unhash, r=cjgillot
Use UnhashMap for a few more maps This avoids a few cases of hashing data that's already hashed. cc https://github.com/rust-lang/rust/issues/56308
This commit is contained in:
commit
1bd42be8cb
4 changed files with 28 additions and 6 deletions
|
@ -75,11 +75,21 @@ impl fmt::LowerHex for Hash64 {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
|
||||
#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default)]
|
||||
pub struct Hash128 {
|
||||
inner: u128,
|
||||
}
|
||||
|
||||
// We expect Hash128 to be well mixed. So there's no point in hashing both parts.
|
||||
//
|
||||
// This also allows using Hash128-containing types in UnHash-based hashmaps, which would otherwise
|
||||
// debug_assert! that we're hashing more than a single u64.
|
||||
impl std::hash::Hash for Hash128 {
|
||||
fn hash<H: std::hash::Hasher>(&self, h: &mut H) {
|
||||
h.write_u64(self.truncate().as_u64());
|
||||
}
|
||||
}
|
||||
|
||||
impl Hash128 {
|
||||
#[inline]
|
||||
pub fn truncate(self) -> Hash64 {
|
||||
|
|
|
@ -314,7 +314,19 @@ impl_stable_traits_for_trivial_type!(char);
|
|||
impl_stable_traits_for_trivial_type!(());
|
||||
|
||||
impl_stable_traits_for_trivial_type!(Hash64);
|
||||
impl_stable_traits_for_trivial_type!(Hash128);
|
||||
|
||||
// We need a custom impl as the default hash function will only hash half the bits. For stable
|
||||
// hashing we want to hash the full 128-bit hash.
|
||||
impl<CTX> HashStable<CTX> for Hash128 {
|
||||
#[inline]
|
||||
fn hash_stable(&self, _: &mut CTX, hasher: &mut StableHasher) {
|
||||
self.as_u128().hash(hasher);
|
||||
}
|
||||
}
|
||||
|
||||
unsafe impl StableOrd for Hash128 {
|
||||
const CAN_USE_UNSTABLE_SORT: bool = true;
|
||||
}
|
||||
|
||||
impl<CTX> HashStable<CTX> for ! {
|
||||
fn hash_stable(&self, _ctx: &mut CTX, _hasher: &mut StableHasher) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue