authorgravatar for yujiri@disroot.orgYujiri <yujiri@disroot.org> 2022-08-12 11:56:00+00:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-14 23:12:48+03:00
log2279f27e0f97e66aedc87ec5c85f05b185a3631d
tree9e1bd8d73677fe2137deef2087570f7f9efab085
parentd2342370fe85491cb8216ccce9cc8fb5259376e2

Fix #12423: auto_hash not hashing arrays of slices uniquely


1 files changed, 17 insertions(+), 18 deletions(-)

lib/std/hash/auto_hash.zig+17-18
...@@ -30,13 +30,15 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy)...@@ -30,13 +30,15 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy)
30 .DeepRecursive => hash(hasher, key.*, .DeepRecursive),30 .DeepRecursive => hash(hasher, key.*, .DeepRecursive),
31 },31 },
3232
33 .Slice => switch (strat) {33 .Slice => {
34 .Shallow => {34 switch (strat) {
35 hashPointer(hasher, key.ptr, .Shallow);35 .Shallow => {
36 hash(hasher, key.len, .Shallow);36 hashPointer(hasher, key.ptr, .Shallow);
37 },37 },
38 .Deep => hashArray(hasher, key, .Shallow),38 .Deep => hashArray(hasher, key, .Shallow),
39 .DeepRecursive => hashArray(hasher, key, .DeepRecursive),39 .DeepRecursive => hashArray(hasher, key, .DeepRecursive),
40 }
41 hash(hasher, key.len, .Shallow);
40 },42 },
4143
42 .Many,44 .Many,
...@@ -53,17 +55,8 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy)...@@ -53,17 +55,8 @@ pub fn hashPointer(hasher: anytype, key: anytype, comptime strat: HashStrategy)
5355
54/// Helper function to hash a set of contiguous objects, from an array or slice.56/// Helper function to hash a set of contiguous objects, from an array or slice.
55pub fn hashArray(hasher: anytype, key: anytype, comptime strat: HashStrategy) void {57pub fn hashArray(hasher: anytype, key: anytype, comptime strat: HashStrategy) void {
56 switch (strat) {58 for (key) |element| {
57 .Shallow => {59 hash(hasher, element, strat);
58 for (key) |element| {
59 hash(hasher, element, .Shallow);
60 }
61 },
62 else => {
63 for (key) |element| {
64 hash(hasher, element, strat);
65 }
66 },
67 }60 }
68}61}
6962
...@@ -359,6 +352,12 @@ test "testHash array" {...@@ -359,6 +352,12 @@ test "testHash array" {
359 try testing.expectEqual(h, hasher.final());352 try testing.expectEqual(h, hasher.final());
360}353}
361354
355test "testHash multi-dimensional array" {
356 const a = [_][]const u32{ &.{ 1, 2, 3 }, &.{ 4, 5 } };
357 const b = [_][]const u32{ &.{ 1, 2 }, &.{ 3, 4, 5 } };
358 try testing.expect(testHash(a) != testHash(b));
359}
360
362test "testHash struct" {361test "testHash struct" {
363 const Foo = struct {362 const Foo = struct {
364 a: u32 = 1,363 a: u32 = 1,