Skip to content

Commit 78e1196

Browse files
Urgaumichaelwoerister
authored andcommitted
Make SipHasher128::finish non-fatal by returning a small-hash
1 parent d85b071 commit 78e1196

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

src/sip128.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,11 @@ impl Hasher for SipHasher128 {
503503
}
504504

505505
fn finish(&self) -> u64 {
506-
panic!("SipHasher128 cannot provide valid 64 bit hashes")
506+
let mut buf = self.buf.clone();
507+
let [a, b] = SipHasher128::finish128_inner(self.nbuf, &mut buf, self.state, self.processed);
508+
509+
// Combining the two halves makes sure we get a good quality hash.
510+
a.wrapping_mul(3).wrapping_add(b).to_le()
507511
}
508512
}
509513

src/sip128/tests.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -303,3 +303,13 @@ fn test_fill_buffer() {
303303
test_fill_buffer!(i128, write_i128);
304304
test_fill_buffer!(isize, write_isize);
305305
}
306+
307+
#[test]
308+
fn test_finish() {
309+
let mut hasher = SipHasher128::new_with_keys(0, 0);
310+
311+
hasher.write_isize(0xF0);
312+
hasher.write_isize(0xF0010);
313+
314+
assert_eq!(hasher.finish(), hasher.finish());
315+
}

0 commit comments

Comments
 (0)