commit 273c35fde1f7addee39203b6fda868f1a91db941
parent 39b09772bba479a15d1eebd3155e5733f1dfe658
Author: Kiëd Llaentenn <kiedtl@tilde.team>
Date: Thu, 29 Apr 2021 15:51:59 +0000
Add hash::crc64
Signed-off-by: Kiëd Llaentenn <kiedtl@tilde.team>
Diffstat:
4 files changed, 334 insertions(+), 0 deletions(-)
diff --git a/hash/crc64/README b/hash/crc64/README
@@ -0,0 +1 @@
+Implements the CRC-64 checksum algorithm. It is a non-cryptographic checksum.
diff --git a/hash/crc64/crc64.ha b/hash/crc64/crc64.ha
@@ -0,0 +1,300 @@
+use endian;
+use hash;
+use io;
+use strings;
+
+// The size, in bytes, of a CRC-64 checksum.
+export def SIZE: size = 8;
+
+// ECMA polynomial for CRC-64. Used in ECMA-182 and xz-utils.
+export const ECMA: u64 = 0xC96C5795D7870F42;
+
+// ISO polynomial for CRC-64. Used in ISO 3309 (high-level data link controls).
+export const ISO: u64 = 0xD800000000000000;
+
+// Table of memoized values for each byte with the ECMA polynomial.
+export const ECMA_TABLE: [256]u64 = [
+ 0x0000000000000000, 0xB32E4CBE03A75F6F, 0xF4843657A840A05B,
+ 0x47AA7AE9ABE7FF34, 0x7BD0C384FF8F5E33, 0xC8FE8F3AFC28015C,
+ 0x8F54F5D357CFFE68, 0x3C7AB96D5468A107, 0xF7A18709FF1EBC66,
+ 0x448FCBB7FCB9E309, 0x0325B15E575E1C3D, 0xB00BFDE054F94352,
+ 0x8C71448D0091E255, 0x3F5F08330336BD3A, 0x78F572DAA8D1420E,
+ 0xCBDB3E64AB761D61, 0x7D9BA13851336649, 0xCEB5ED8652943926,
+ 0x891F976FF973C612, 0x3A31DBD1FAD4997D, 0x064B62BCAEBC387A,
+ 0xB5652E02AD1B6715, 0xF2CF54EB06FC9821, 0x41E11855055BC74E,
+ 0x8A3A2631AE2DDA2F, 0x39146A8FAD8A8540, 0x7EBE1066066D7A74,
+ 0xCD905CD805CA251B, 0xF1EAE5B551A2841C, 0x42C4A90B5205DB73,
+ 0x056ED3E2F9E22447, 0xB6409F5CFA457B28, 0xFB374270A266CC92,
+ 0x48190ECEA1C193FD, 0x0FB374270A266CC9, 0xBC9D3899098133A6,
+ 0x80E781F45DE992A1, 0x33C9CD4A5E4ECDCE, 0x7463B7A3F5A932FA,
+ 0xC74DFB1DF60E6D95, 0x0C96C5795D7870F4, 0xBFB889C75EDF2F9B,
+ 0xF812F32EF538D0AF, 0x4B3CBF90F69F8FC0, 0x774606FDA2F72EC7,
+ 0xC4684A43A15071A8, 0x83C230AA0AB78E9C, 0x30EC7C140910D1F3,
+ 0x86ACE348F355AADB, 0x3582AFF6F0F2F5B4, 0x7228D51F5B150A80,
+ 0xC10699A158B255EF, 0xFD7C20CC0CDAF4E8, 0x4E526C720F7DAB87,
+ 0x09F8169BA49A54B3, 0xBAD65A25A73D0BDC, 0x710D64410C4B16BD,
+ 0xC22328FF0FEC49D2, 0x85895216A40BB6E6, 0x36A71EA8A7ACE989,
+ 0x0ADDA7C5F3C4488E, 0xB9F3EB7BF06317E1, 0xFE5991925B84E8D5,
+ 0x4D77DD2C5823B7BA, 0x64B62BCAEBC387A1, 0xD7986774E864D8CE,
+ 0x90321D9D438327FA, 0x231C512340247895, 0x1F66E84E144CD992,
+ 0xAC48A4F017EB86FD, 0xEBE2DE19BC0C79C9, 0x58CC92A7BFAB26A6,
+ 0x9317ACC314DD3BC7, 0x2039E07D177A64A8, 0x67939A94BC9D9B9C,
+ 0xD4BDD62ABF3AC4F3, 0xE8C76F47EB5265F4, 0x5BE923F9E8F53A9B,
+ 0x1C4359104312C5AF, 0xAF6D15AE40B59AC0, 0x192D8AF2BAF0E1E8,
+ 0xAA03C64CB957BE87, 0xEDA9BCA512B041B3, 0x5E87F01B11171EDC,
+ 0x62FD4976457FBFDB, 0xD1D305C846D8E0B4, 0x96797F21ED3F1F80,
+ 0x2557339FEE9840EF, 0xEE8C0DFB45EE5D8E, 0x5DA24145464902E1,
+ 0x1A083BACEDAEFDD5, 0xA9267712EE09A2BA, 0x955CCE7FBA6103BD,
+ 0x267282C1B9C65CD2, 0x61D8F8281221A3E6, 0xD2F6B4961186FC89,
+ 0x9F8169BA49A54B33, 0x2CAF25044A02145C, 0x6B055FEDE1E5EB68,
+ 0xD82B1353E242B407, 0xE451AA3EB62A1500, 0x577FE680B58D4A6F,
+ 0x10D59C691E6AB55B, 0xA3FBD0D71DCDEA34, 0x6820EEB3B6BBF755,
+ 0xDB0EA20DB51CA83A, 0x9CA4D8E41EFB570E, 0x2F8A945A1D5C0861,
+ 0x13F02D374934A966, 0xA0DE61894A93F609, 0xE7741B60E174093D,
+ 0x545A57DEE2D35652, 0xE21AC88218962D7A, 0x5134843C1B317215,
+ 0x169EFED5B0D68D21, 0xA5B0B26BB371D24E, 0x99CA0B06E7197349,
+ 0x2AE447B8E4BE2C26, 0x6D4E3D514F59D312, 0xDE6071EF4CFE8C7D,
+ 0x15BB4F8BE788911C, 0xA6950335E42FCE73, 0xE13F79DC4FC83147,
+ 0x521135624C6F6E28, 0x6E6B8C0F1807CF2F, 0xDD45C0B11BA09040,
+ 0x9AEFBA58B0476F74, 0x29C1F6E6B3E0301B, 0xC96C5795D7870F42,
+ 0x7A421B2BD420502D, 0x3DE861C27FC7AF19, 0x8EC62D7C7C60F076,
+ 0xB2BC941128085171, 0x0192D8AF2BAF0E1E, 0x4638A2468048F12A,
+ 0xF516EEF883EFAE45, 0x3ECDD09C2899B324, 0x8DE39C222B3EEC4B,
+ 0xCA49E6CB80D9137F, 0x7967AA75837E4C10, 0x451D1318D716ED17,
+ 0xF6335FA6D4B1B278, 0xB199254F7F564D4C, 0x02B769F17CF11223,
+ 0xB4F7F6AD86B4690B, 0x07D9BA1385133664, 0x4073C0FA2EF4C950,
+ 0xF35D8C442D53963F, 0xCF273529793B3738, 0x7C0979977A9C6857,
+ 0x3BA3037ED17B9763, 0x888D4FC0D2DCC80C, 0x435671A479AAD56D,
+ 0xF0783D1A7A0D8A02, 0xB7D247F3D1EA7536, 0x04FC0B4DD24D2A59,
+ 0x3886B22086258B5E, 0x8BA8FE9E8582D431, 0xCC0284772E652B05,
+ 0x7F2CC8C92DC2746A, 0x325B15E575E1C3D0, 0x8175595B76469CBF,
+ 0xC6DF23B2DDA1638B, 0x75F16F0CDE063CE4, 0x498BD6618A6E9DE3,
+ 0xFAA59ADF89C9C28C, 0xBD0FE036222E3DB8, 0x0E21AC88218962D7,
+ 0xC5FA92EC8AFF7FB6, 0x76D4DE52895820D9, 0x317EA4BB22BFDFED,
+ 0x8250E80521188082, 0xBE2A516875702185, 0x0D041DD676D77EEA,
+ 0x4AAE673FDD3081DE, 0xF9802B81DE97DEB1, 0x4FC0B4DD24D2A599,
+ 0xFCEEF8632775FAF6, 0xBB44828A8C9205C2, 0x086ACE348F355AAD,
+ 0x34107759DB5DFBAA, 0x873E3BE7D8FAA4C5, 0xC094410E731D5BF1,
+ 0x73BA0DB070BA049E, 0xB86133D4DBCC19FF, 0x0B4F7F6AD86B4690,
+ 0x4CE50583738CB9A4, 0xFFCB493D702BE6CB, 0xC3B1F050244347CC,
+ 0x709FBCEE27E418A3, 0x3735C6078C03E797, 0x841B8AB98FA4B8F8,
+ 0xADDA7C5F3C4488E3, 0x1EF430E13FE3D78C, 0x595E4A08940428B8,
+ 0xEA7006B697A377D7, 0xD60ABFDBC3CBD6D0, 0x6524F365C06C89BF,
+ 0x228E898C6B8B768B, 0x91A0C532682C29E4, 0x5A7BFB56C35A3485,
+ 0xE955B7E8C0FD6BEA, 0xAEFFCD016B1A94DE, 0x1DD181BF68BDCBB1,
+ 0x21AB38D23CD56AB6, 0x9285746C3F7235D9, 0xD52F0E859495CAED,
+ 0x6601423B97329582, 0xD041DD676D77EEAA, 0x636F91D96ED0B1C5,
+ 0x24C5EB30C5374EF1, 0x97EBA78EC690119E, 0xAB911EE392F8B099,
+ 0x18BF525D915FEFF6, 0x5F1528B43AB810C2, 0xEC3B640A391F4FAD,
+ 0x27E05A6E926952CC, 0x94CE16D091CE0DA3, 0xD3646C393A29F297,
+ 0x604A2087398EADF8, 0x5C3099EA6DE60CFF, 0xEF1ED5546E415390,
+ 0xA8B4AFBDC5A6ACA4, 0x1B9AE303C601F3CB, 0x56ED3E2F9E224471,
+ 0xE5C372919D851B1E, 0xA26908783662E42A, 0x114744C635C5BB45,
+ 0x2D3DFDAB61AD1A42, 0x9E13B115620A452D, 0xD9B9CBFCC9EDBA19,
+ 0x6A978742CA4AE576, 0xA14CB926613CF817, 0x1262F598629BA778,
+ 0x55C88F71C97C584C, 0xE6E6C3CFCADB0723, 0xDA9C7AA29EB3A624,
+ 0x69B2361C9D14F94B, 0x2E184CF536F3067F, 0x9D36004B35545910,
+ 0x2B769F17CF112238, 0x9858D3A9CCB67D57, 0xDFF2A94067518263,
+ 0x6CDCE5FE64F6DD0C, 0x50A65C93309E7C0B, 0xE388102D33392364,
+ 0xA4226AC498DEDC50, 0x170C267A9B79833F, 0xDCD7181E300F9E5E,
+ 0x6FF954A033A8C131, 0x28532E49984F3E05, 0x9B7D62F79BE8616A,
+ 0xA707DB9ACF80C06D, 0x14299724CC279F02, 0x5383EDCD67C06036,
+ 0xE0ADA17364673F59,
+];
+
+// Table of memoized values for each byte with the ISO polynomial.
+export const ISO_TABLE: [256]u64 = [
+ 0x0000000000000000, 0x01B0000000000000, 0x0360000000000000,
+ 0x02D0000000000000, 0x06C0000000000000, 0x0770000000000000,
+ 0x05A0000000000000, 0x0410000000000000, 0x0D80000000000000,
+ 0x0C30000000000000, 0x0EE0000000000000, 0x0F50000000000000,
+ 0x0B40000000000000, 0x0AF0000000000000, 0x0820000000000000,
+ 0x0990000000000000, 0x1B00000000000000, 0x1AB0000000000000,
+ 0x1860000000000000, 0x19D0000000000000, 0x1DC0000000000000,
+ 0x1C70000000000000, 0x1EA0000000000000, 0x1F10000000000000,
+ 0x1680000000000000, 0x1730000000000000, 0x15E0000000000000,
+ 0x1450000000000000, 0x1040000000000000, 0x11F0000000000000,
+ 0x1320000000000000, 0x1290000000000000, 0x3600000000000000,
+ 0x37B0000000000000, 0x3560000000000000, 0x34D0000000000000,
+ 0x30C0000000000000, 0x3170000000000000, 0x33A0000000000000,
+ 0x3210000000000000, 0x3B80000000000000, 0x3A30000000000000,
+ 0x38E0000000000000, 0x3950000000000000, 0x3D40000000000000,
+ 0x3CF0000000000000, 0x3E20000000000000, 0x3F90000000000000,
+ 0x2D00000000000000, 0x2CB0000000000000, 0x2E60000000000000,
+ 0x2FD0000000000000, 0x2BC0000000000000, 0x2A70000000000000,
+ 0x28A0000000000000, 0x2910000000000000, 0x2080000000000000,
+ 0x2130000000000000, 0x23E0000000000000, 0x2250000000000000,
+ 0x2640000000000000, 0x27F0000000000000, 0x2520000000000000,
+ 0x2490000000000000, 0x6C00000000000000, 0x6DB0000000000000,
+ 0x6F60000000000000, 0x6ED0000000000000, 0x6AC0000000000000,
+ 0x6B70000000000000, 0x69A0000000000000, 0x6810000000000000,
+ 0x6180000000000000, 0x6030000000000000, 0x62E0000000000000,
+ 0x6350000000000000, 0x6740000000000000, 0x66F0000000000000,
+ 0x6420000000000000, 0x6590000000000000, 0x7700000000000000,
+ 0x76B0000000000000, 0x7460000000000000, 0x75D0000000000000,
+ 0x71C0000000000000, 0x7070000000000000, 0x72A0000000000000,
+ 0x7310000000000000, 0x7A80000000000000, 0x7B30000000000000,
+ 0x79E0000000000000, 0x7850000000000000, 0x7C40000000000000,
+ 0x7DF0000000000000, 0x7F20000000000000, 0x7E90000000000000,
+ 0x5A00000000000000, 0x5BB0000000000000, 0x5960000000000000,
+ 0x58D0000000000000, 0x5CC0000000000000, 0x5D70000000000000,
+ 0x5FA0000000000000, 0x5E10000000000000, 0x5780000000000000,
+ 0x5630000000000000, 0x54E0000000000000, 0x5550000000000000,
+ 0x5140000000000000, 0x50F0000000000000, 0x5220000000000000,
+ 0x5390000000000000, 0x4100000000000000, 0x40B0000000000000,
+ 0x4260000000000000, 0x43D0000000000000, 0x47C0000000000000,
+ 0x4670000000000000, 0x44A0000000000000, 0x4510000000000000,
+ 0x4C80000000000000, 0x4D30000000000000, 0x4FE0000000000000,
+ 0x4E50000000000000, 0x4A40000000000000, 0x4BF0000000000000,
+ 0x4920000000000000, 0x4890000000000000, 0xD800000000000000,
+ 0xD9B0000000000000, 0xDB60000000000000, 0xDAD0000000000000,
+ 0xDEC0000000000000, 0xDF70000000000000, 0xDDA0000000000000,
+ 0xDC10000000000000, 0xD580000000000000, 0xD430000000000000,
+ 0xD6E0000000000000, 0xD750000000000000, 0xD340000000000000,
+ 0xD2F0000000000000, 0xD020000000000000, 0xD190000000000000,
+ 0xC300000000000000, 0xC2B0000000000000, 0xC060000000000000,
+ 0xC1D0000000000000, 0xC5C0000000000000, 0xC470000000000000,
+ 0xC6A0000000000000, 0xC710000000000000, 0xCE80000000000000,
+ 0xCF30000000000000, 0xCDE0000000000000, 0xCC50000000000000,
+ 0xC840000000000000, 0xC9F0000000000000, 0xCB20000000000000,
+ 0xCA90000000000000, 0xEE00000000000000, 0xEFB0000000000000,
+ 0xED60000000000000, 0xECD0000000000000, 0xE8C0000000000000,
+ 0xE970000000000000, 0xEBA0000000000000, 0xEA10000000000000,
+ 0xE380000000000000, 0xE230000000000000, 0xE0E0000000000000,
+ 0xE150000000000000, 0xE540000000000000, 0xE4F0000000000000,
+ 0xE620000000000000, 0xE790000000000000, 0xF500000000000000,
+ 0xF4B0000000000000, 0xF660000000000000, 0xF7D0000000000000,
+ 0xF3C0000000000000, 0xF270000000000000, 0xF0A0000000000000,
+ 0xF110000000000000, 0xF880000000000000, 0xF930000000000000,
+ 0xFBE0000000000000, 0xFA50000000000000, 0xFE40000000000000,
+ 0xFFF0000000000000, 0xFD20000000000000, 0xFC90000000000000,
+ 0xB400000000000000, 0xB5B0000000000000, 0xB760000000000000,
+ 0xB6D0000000000000, 0xB2C0000000000000, 0xB370000000000000,
+ 0xB1A0000000000000, 0xB010000000000000, 0xB980000000000000,
+ 0xB830000000000000, 0xBAE0000000000000, 0xBB50000000000000,
+ 0xBF40000000000000, 0xBEF0000000000000, 0xBC20000000000000,
+ 0xBD90000000000000, 0xAF00000000000000, 0xAEB0000000000000,
+ 0xAC60000000000000, 0xADD0000000000000, 0xA9C0000000000000,
+ 0xA870000000000000, 0xAAA0000000000000, 0xAB10000000000000,
+ 0xA280000000000000, 0xA330000000000000, 0xA1E0000000000000,
+ 0xA050000000000000, 0xA440000000000000, 0xA5F0000000000000,
+ 0xA720000000000000, 0xA690000000000000, 0x8200000000000000,
+ 0x83B0000000000000, 0x8160000000000000, 0x80D0000000000000,
+ 0x84C0000000000000, 0x8570000000000000, 0x87A0000000000000,
+ 0x8610000000000000, 0x8F80000000000000, 0x8E30000000000000,
+ 0x8CE0000000000000, 0x8D50000000000000, 0x8940000000000000,
+ 0x88F0000000000000, 0x8A20000000000000, 0x8B90000000000000,
+ 0x9900000000000000, 0x98B0000000000000, 0x9A60000000000000,
+ 0x9BD0000000000000, 0x9FC0000000000000, 0x9E70000000000000,
+ 0x9CA0000000000000, 0x9D10000000000000, 0x9480000000000000,
+ 0x9530000000000000, 0x97E0000000000000, 0x9650000000000000,
+ 0x9240000000000000, 0x93F0000000000000, 0x9120000000000000,
+ 0x9090000000000000,
+];
+
+// Populate a user-provided buffer with the memoized values for a custom
+// polynomial.
+//
+// The user-provided polynomial must be in the reversed form.
+export fn memoize(polynomial: u64, buf: *[256]u64) void = {
+ for (let i = 0z; i < 256; i += 1) {
+ let value = i: u64;
+ for (let z = 0z; z < 8; z += 1) {
+ value = if (value & 0x1 == 1) {
+ (value >> 1) ^ polynomial;
+ } else {
+ value >> 1;
+ };
+ };
+ buf[i] = value;
+ };
+};
+
+type state = struct {
+ hash: hash::hash,
+ table: *[256]u64,
+ cval: u64,
+};
+
+// Creates a [[hash::hash]] which computes the CRC-64 algorithm.
+//
+// It takes a table of memoized values for a given polynomail (for example,
+// [[ISO_TABLE]] or [[ECMA_TABLE]]); a table for a custom polynomial, populated
+// by [[memoize]] function, may also be used.
+export fn crc64(table: *[256]u64) *hash::hash = alloc(state {
+ hash = hash::hash {
+ stream = io::stream {
+ writer = &write,
+ closer = &close,
+ ...
+ },
+ sum = &sum,
+ reset = &reset,
+ sz = SIZE,
+ },
+ table = table,
+ cval = ~0u64,
+}): *hash::hash;
+
+fn close(s: *io::stream) void = free(s);
+
+fn write(s: *io::stream, buf: const []u8) (size | io::error) = {
+ let s = s: *state;
+ for (let i = 0z; i < len(buf); i += 1) {
+ let rightbits = s.cval & 0xFF;
+ s.cval = s.table[rightbits ^ buf[i]] ^ (s.cval >> 8);
+ };
+ return len(buf);
+};
+
+fn reset(h: *hash::hash) void = {
+ let h = h: *state;
+ h.cval = ~0u64;
+};
+
+fn sum(h: *hash::hash, buf: []u8) void = {
+ let h = h: *state;
+ endian::host.putu64(buf, ~h.cval);
+};
+
+export fn sum64(h: *hash::hash) u64 = {
+ assert(h.reset == &reset);
+ let h = h: *state;
+ return ~h.cval;
+};
+
+@test fn crc64() void = {
+ const vectors: [](str, u64, u64, u64) = [
+ ("", 0, 0, 0),
+ ("Man can believe the impossible, but can never believe the improbable. -- Oscar Wilde",
+ 0x17F71EF3BB851DC7, 0xD0E8ED57865D6AC6),
+ ("We learn from history that we do not learn from history. -- Georg Hegel",
+ 0xAA3C335BB49ABE9D, 0x5FD192CC516BBEC3),
+ ("The final delusion is the belief that one has lost all delusions. -- Maurice Chapelain",
+ 0x7DFC4F7CE9552D23, 0xF71B429C925D99AE),
+ ];
+
+ let crc_ecma = crc64(&ECMA_TABLE);
+ defer hash::close(crc_ecma);
+
+ let crc_iso = crc64(&ISO_TABLE);
+ defer hash::close(crc_iso);
+
+ let buf: [SIZE]u8 = [0...];
+
+ for (let i = 0z; i < len(vectors); i += 1) {
+ let vec = vectors[i];
+
+ hash::reset(crc_ecma);
+ hash::write(crc_ecma, strings::toutf8(vec.0));
+ hash::sum(crc_ecma, buf);
+ assert(endian::host.getu64(buf) == vec.1);
+ assert(sum64(crc_ecma) == vec.1);
+
+ hash::reset(crc_iso);
+ hash::write(crc_iso, strings::toutf8(vec.0));
+ hash::sum(crc_iso, buf);
+ assert(endian::host.getu64(buf) == vec.2);
+ assert(sum64(crc_iso) == vec.2);
+ };
+};
diff --git a/scripts/gen-stdlib b/scripts/gen-stdlib
@@ -461,6 +461,12 @@ hash_crc32() {
gen_ssa hash::crc32 endian hash io strings fmt
}
+hash_crc64() {
+ gen_srcs hash::crc64 \
+ crc64.ha
+ gen_ssa hash::crc64 endian hash io strings
+}
+
hash_fnv() {
gen_srcs hash::fnv \
fnv.ha
@@ -747,6 +753,7 @@ hash
hash_adler32
hash_crc16
hash_crc32
+hash_crc64
hash_fnv
io
linux
diff --git a/stdlib.mk b/stdlib.mk
@@ -179,6 +179,9 @@ hare_stdlib_deps+=$(stdlib_hash_crc16)
stdlib_hash_crc32=$(HARECACHE)/hash/crc32/hash_crc32.o
hare_stdlib_deps+=$(stdlib_hash_crc32)
+stdlib_hash_crc64=$(HARECACHE)/hash/crc64/hash_crc64.o
+hare_stdlib_deps+=$(stdlib_hash_crc64)
+
stdlib_hash_fnv=$(HARECACHE)/hash/fnv/hash_fnv.o
hare_stdlib_deps+=$(stdlib_hash_fnv)
@@ -641,6 +644,16 @@ $(HARECACHE)/hash/crc32/hash_crc32.ssa: $(stdlib_hash_crc32_srcs) $(stdlib_rt) $
@HARECACHE=$(HARECACHE) $(HAREC) $(HAREFLAGS) -o $@ -Nhash::crc32 \
-t$(HARECACHE)/hash/crc32/hash_crc32.td $(stdlib_hash_crc32_srcs)
+# hash::crc64
+stdlib_hash_crc64_srcs= \
+ $(STDLIB)/hash/crc64/crc64.ha
+
+$(HARECACHE)/hash/crc64/hash_crc64.ssa: $(stdlib_hash_crc64_srcs) $(stdlib_rt) $(stdlib_endian) $(stdlib_hash) $(stdlib_io) $(stdlib_strings)
+ @printf 'HAREC \t$@\n'
+ @mkdir -p $(HARECACHE)/hash/crc64
+ @HARECACHE=$(HARECACHE) $(HAREC) $(HAREFLAGS) -o $@ -Nhash::crc64 \
+ -t$(HARECACHE)/hash/crc64/hash_crc64.td $(stdlib_hash_crc64_srcs)
+
# hash::fnv
stdlib_hash_fnv_srcs= \
$(STDLIB)/hash/fnv/fnv.ha
@@ -1121,6 +1134,9 @@ hare_testlib_deps+=$(testlib_hash_crc16)
testlib_hash_crc32=$(TESTCACHE)/hash/crc32/hash_crc32.o
hare_testlib_deps+=$(testlib_hash_crc32)
+testlib_hash_crc64=$(TESTCACHE)/hash/crc64/hash_crc64.o
+hare_testlib_deps+=$(testlib_hash_crc64)
+
testlib_hash_fnv=$(TESTCACHE)/hash/fnv/hash_fnv.o
hare_testlib_deps+=$(testlib_hash_fnv)
@@ -1598,6 +1614,16 @@ $(TESTCACHE)/hash/crc32/hash_crc32.ssa: $(testlib_hash_crc32_srcs) $(testlib_rt)
@HARECACHE=$(TESTCACHE) $(HAREC) $(TESTHAREFLAGS) -o $@ -Nhash::crc32 \
-t$(TESTCACHE)/hash/crc32/hash_crc32.td $(testlib_hash_crc32_srcs)
+# hash::crc64
+testlib_hash_crc64_srcs= \
+ $(STDLIB)/hash/crc64/crc64.ha
+
+$(TESTCACHE)/hash/crc64/hash_crc64.ssa: $(testlib_hash_crc64_srcs) $(testlib_rt) $(testlib_endian) $(testlib_hash) $(testlib_io) $(testlib_strings)
+ @printf 'HAREC \t$@\n'
+ @mkdir -p $(TESTCACHE)/hash/crc64
+ @HARECACHE=$(TESTCACHE) $(HAREC) $(TESTHAREFLAGS) -o $@ -Nhash::crc64 \
+ -t$(TESTCACHE)/hash/crc64/hash_crc64.td $(testlib_hash_crc64_srcs)
+
# hash::fnv
testlib_hash_fnv_srcs= \
$(STDLIB)/hash/fnv/fnv.ha