From 65a3279f4a221e97c97ca1c49d89626c8700d017 Mon Sep 17 00:00:00 2001 From: Jakub Beránek Date: Sat, 18 Dec 2021 20:41:58 +0100 Subject: Do not hash zero bytes of i64 and u32 in Sip128 hasher --- compiler/rustc_data_structures/src/sip128.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'compiler/rustc_data_structures/src') diff --git a/compiler/rustc_data_structures/src/sip128.rs b/compiler/rustc_data_structures/src/sip128.rs index 53062b9c20d..872b0eb7854 100644 --- a/compiler/rustc_data_structures/src/sip128.rs +++ b/compiler/rustc_data_structures/src/sip128.rs @@ -409,6 +409,20 @@ impl SipHasher128 { } } +macro_rules! dispatch_value { + ($target: expr, $value:expr) => { + let value = $value; + #[allow(unreachable_patterns)] + #[allow(overflowing_literals)] + match value { + 0..=0xFF => $target.short_write(value as u8), + 0x100..=0xFFFF => $target.short_write(value as u16), + 0x10000..=0xFFFFFFFF => $target.short_write(value as u32), + _ => $target.short_write(value as u64), + } + }; +} + impl Hasher for SipHasher128 { #[inline] fn write_u8(&mut self, i: u8) { @@ -422,7 +436,7 @@ impl Hasher for SipHasher128 { #[inline] fn write_u32(&mut self, i: u32) { - self.short_write(i); + dispatch_value!(self, i); } #[inline] @@ -452,7 +466,7 @@ impl Hasher for SipHasher128 { #[inline] fn write_i64(&mut self, i: i64) { - self.short_write(i as u64); + dispatch_value!(self, i as u64); } #[inline] -- cgit 1.4.1-3-g733a5