authorgravatar for 189900@gmail.comnone <189900@gmail.com> 2023-08-05 12:45:33+03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2024-01-29 14:24:17-07:00
loge35271856e0002ef91828918470719ca5d838d45
treead8613effa85301683b1ab822781e17bb8dd5c35
parent8c94e993e4bfe5015297083bba2120ba75ea9e58

wyhash: keep tail bytes on iterative update

Update calls with input longer then one block must ensure that last sixteen bytes are available when final is called. Fixes #16695

1 files changed, 20 insertions(+), 0 deletions(-)

lib/std/hash/wyhash.zig+20
......@@ -57,6 +57,10 @@ pub const Wyhash = struct {
5757 }
5858
5959 const remaining_bytes = input[i..];
60 if (remaining_bytes.len < 16 and i >= 48) {
61 const rem = 16 - remaining_bytes.len;
62 @memcpy(self.buf[self.buf.len - rem ..], input[i - rem .. i]);
63 }
6064 @memcpy(self.buf[0..remaining_bytes.len], remaining_bytes);
6165 self.buf_len = remaining_bytes.len;
6266 }
......@@ -271,3 +275,19 @@ test "iterative non-divisible update" {
271275 try std.testing.expectEqual(iterative_hash, non_iterative_hash);
272276 }
273277}
278
279test "iterative maintains last sixteen" {
280 const input = "Z" ** 48 ++ "01234567890abcdefg";
281 const seed = 0;
282
283 for (0..17) |i| {
284 const payload = input[0 .. input.len - i];
285 const non_iterative_hash = Wyhash.hash(seed, payload);
286
287 var wh = Wyhash.init(seed);
288 wh.update(payload);
289 const iterative_hash = wh.final();
290
291 try expectEqual(non_iterative_hash, iterative_hash);
292 }
293}