Skip to content

Commit

Permalink
Avoid sorting in hash map stable hashing
Browse files Browse the repository at this point in the history
  • Loading branch information
Kobzol committed Dec 12, 2021
1 parent 58457bb commit a5f5f6b
Showing 1 changed file with 14 additions and 4 deletions.
18 changes: 14 additions & 4 deletions compiler/rustc_data_structures/src/stable_hasher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,15 @@ impl StableHasher {
}

impl StableHasherResult for u128 {
#[inline]
fn finish(hasher: StableHasher) -> Self {
let (_0, _1) = hasher.finalize();
u128::from(_0) | (u128::from(_1) << 64)
}
}

impl StableHasherResult for u64 {
#[inline]
fn finish(hasher: StableHasher) -> Self {
hasher.finalize().0
}
Expand Down Expand Up @@ -559,8 +561,16 @@ pub fn hash_stable_hashmap<HCX, K, V, R, SK, F>(
SK: HashStable<HCX> + Ord,
F: Fn(&K, &HCX) -> SK,
{
let mut entries: SmallVec<[_; 3]> =
map.iter().map(|(k, v)| (to_stable_hash_key(k, hcx), v)).collect();
entries.sort_unstable_by(|&(ref sk1, _), &(ref sk2, _)| sk1.cmp(sk2));
entries.hash_stable(hcx, hasher);
let hash = map
.iter()
.map(|(key, value)| {
let key = to_stable_hash_key(key, hcx);
let mut hasher = StableHasher::new();
key.hash_stable(hcx, &mut hasher);
value.hash_stable(hcx, &mut hasher);
hasher.finish::<u128>()
})
.reduce(|accum, value| accum.wrapping_mul(value));
map.len().hash_stable(hcx, hasher);
hash.hash_stable(hcx, hasher);
}

0 comments on commit a5f5f6b

Please sign in to comment.