From f4d0f74dbbe0cc1dca7a5c40fea8e3f683cf5b38 Mon Sep 17 00:00:00 2001 From: Jeroen van Rijn Date: Thu, 25 Mar 2021 13:48:34 +0100 Subject: [PATCH] Allow seeding CRC32, CRC64 & Adler32 with previous partial hash. Foo := []u8{'F', 'o','o', '3', 'F', 'o', 'o', '4'}; crc := hash.crc32(Foo[0:4]); crc = hash.crc32(Foo[4:], crc); crc_all := hash.crc32(Foo); fmt.printf("%8x %8x\n", crc, crc_all); d6285ff7 d6285ff7 a32 := hash.adler32(Foo[0:4]); a32 = hash.adler32(Foo[4:], a32); a32_all := hash.adler32(Foo); fmt.printf("%8x %8x\n", a32, a32_all); 0c5102b0 0c5102b0 --- core/hash/crc.odin | 8 ++++---- core/hash/hash.odin | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/hash/crc.odin b/core/hash/crc.odin index 008310408..bb31669d0 100644 --- a/core/hash/crc.odin +++ b/core/hash/crc.odin @@ -1,14 +1,14 @@ package hash -crc32 :: proc(data: []byte) -> u32 #no_bounds_check { - result := ~u32(0); +crc32 :: proc(data: []byte, seed := u32(0)) -> u32 #no_bounds_check { + result := ~u32(seed); for b in data { result = result>>8 ~ _crc32_table[(result ~ u32(b)) & 0xff]; } return ~result; } -crc64 :: proc(data: []byte) -> u64 #no_bounds_check { - result := ~u64(0); +crc64 :: proc(data: []byte, seed := u32(0)) -> u64 #no_bounds_check { + result := ~u64(seed); for b in data { result = result>>8 ~ _crc64_table[(result ~ u64(b)) & 0xff]; } diff --git a/core/hash/hash.odin b/core/hash/hash.odin index 391fc09f7..5bd2f6e10 100644 --- a/core/hash/hash.odin +++ b/core/hash/hash.odin @@ -2,9 +2,9 @@ package hash import "core:mem" -adler32 :: proc(data: []byte) -> u32 { +adler32 :: proc(data: []byte, seed := u32(1)) -> u32 { ADLER_CONST :: 65521; - a, b: u32 = 1, 0; + a, b: u32 = seed & 0xFFFF, seed >> 16; for x in data { a = (a + u32(x)) % ADLER_CONST; b = (b + a) % ADLER_CONST;