| ... | ... | @@ -42,18 +42,23 @@ pub const Adler32 = struct { |
| 42 | 42 | |
| 43 | 43 | s2 %= base; |
| 44 | 44 | } else { |
| 45 | const n = nmax / 16; // note: 16 | nmax |
| 46 | |
| 45 | 47 | var i: usize = 0; |
| 46 | | while (i + nmax <= input.len) : (i += nmax) { |
| 47 | | const n = nmax / 16; // note: 16 | nmax |
| 48 | 48 | |
| 49 | while (i + nmax <= input.len) { |
| 49 | 50 | var rounds: usize = 0; |
| 50 | 51 | while (rounds < n) : (rounds += 1) { |
| 51 | 52 | comptime var j: usize = 0; |
| 52 | 53 | inline while (j < 16) : (j += 1) { |
| 53 | | s1 +%= input[i + n * j]; |
| 54 | s1 +%= input[i + j]; |
| 54 | 55 | s2 +%= s1; |
| 55 | 56 | } |
| 57 | i += 16; |
| 56 | 58 | } |
| 59 | |
| 60 | s1 %= base; |
| 61 | s2 %= base; |
| 57 | 62 | } |
| 58 | 63 | |
| 59 | 64 | if (i < input.len) { |
| ... | ... | @@ -89,19 +94,35 @@ pub const Adler32 = struct { |
| 89 | 94 | }; |
| 90 | 95 | |
| 91 | 96 | test "adler32 sanity" { |
| 92 | | testing.expect(Adler32.hash("a") == 0x620062); |
| 93 | | testing.expect(Adler32.hash("example") == 0xbc002ed); |
| 97 | testing.expectEqual(@as(u32, 0x620062), Adler32.hash("a")); |
| 98 | testing.expectEqual(@as(u32, 0xbc002ed), Adler32.hash("example")); |
| 94 | 99 | } |
| 95 | 100 | |
| 96 | 101 | test "adler32 long" { |
| 97 | 102 | const long1 = [_]u8{1} ** 1024; |
| 98 | | testing.expect(Adler32.hash(long1[0..]) == 0x06780401); |
| 103 | testing.expectEqual(@as(u32, 0x06780401), Adler32.hash(long1[0..])); |
| 99 | 104 | |
| 100 | 105 | const long2 = [_]u8{1} ** 1025; |
| 101 | | testing.expect(Adler32.hash(long2[0..]) == 0x0a7a0402); |
| 106 | testing.expectEqual(@as(u32, 0x0a7a0402), Adler32.hash(long2[0..])); |
| 102 | 107 | } |
| 103 | 108 | |
| 104 | 109 | test "adler32 very long" { |
| 105 | 110 | const long = [_]u8{1} ** 5553; |
| 106 | | testing.expect(Adler32.hash(long[0..]) == 0x707f15b2); |
| 111 | testing.expectEqual(@as(u32, 0x707f15b2), Adler32.hash(long[0..])); |
| 112 | } |
| 113 | |
| 114 | test "adler32 very long with variation" { |
| 115 | const long = comptime blk: { |
| 116 | @setEvalBranchQuota(7000); |
| 117 | var result: [6000]u8 = undefined; |
| 118 | |
| 119 | var i: usize = 0; |
| 120 | while (i < result.len) : (i += 1) { |
| 121 | result[i] = @truncate(u8, i); |
| 122 | } |
| 123 | |
| 124 | break :blk result; |
| 125 | }; |
| 126 | |
| 127 | testing.expectEqual(@as(u32, 0x5af38d6e), std.hash.Adler32.hash(long[0..])); |
| 107 | 128 | } |