stir the hash state a little to avoid prefix collisions
This commit is contained in:
parent
dd509c7a63
commit
f21683432b
@ -3098,15 +3098,19 @@ fn hash<H: Hasher>(&self, h: &mut H) {
|
||||
let bytes = &bytes[prefix_len..];
|
||||
|
||||
let mut component_start = 0;
|
||||
let mut bytes_hashed = 0;
|
||||
// track some extra state to avoid prefix collisions.
|
||||
// ["foo", "bar"] and ["foobar"], will have the same payload bytes
|
||||
// but result in different chunk_bits
|
||||
let mut chunk_bits: usize = 0;
|
||||
|
||||
for i in 0..bytes.len() {
|
||||
let is_sep = if verbatim { is_verbatim_sep(bytes[i]) } else { is_sep_byte(bytes[i]) };
|
||||
if is_sep {
|
||||
if i > component_start {
|
||||
let to_hash = &bytes[component_start..i];
|
||||
chunk_bits = chunk_bits.wrapping_add(to_hash.len());
|
||||
chunk_bits = chunk_bits.rotate_right(2);
|
||||
h.write(to_hash);
|
||||
bytes_hashed += to_hash.len();
|
||||
}
|
||||
|
||||
// skip over separator and optionally a following CurDir item
|
||||
@ -3127,11 +3131,12 @@ fn hash<H: Hasher>(&self, h: &mut H) {
|
||||
|
||||
if component_start < bytes.len() {
|
||||
let to_hash = &bytes[component_start..];
|
||||
chunk_bits = chunk_bits.wrapping_add(to_hash.len());
|
||||
chunk_bits = chunk_bits.rotate_right(2);
|
||||
h.write(to_hash);
|
||||
bytes_hashed += to_hash.len();
|
||||
}
|
||||
|
||||
h.write_usize(bytes_hashed);
|
||||
h.write_usize(chunk_bits);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user