aboutsummaryrefslogtreecommitdiff
path: root/core/hash
diff options
context:
space:
mode:
authorJeroen van Rijn <Kelimion@users.noreply.github.com>2021-03-25 13:48:34 +0100
committerJeroen van Rijn <Kelimion@users.noreply.github.com>2021-03-25 13:48:34 +0100
commitf4d0f74dbbe0cc1dca7a5c40fea8e3f683cf5b38 (patch)
treec0025ae5d75ce19418d49c4bf4b8bd7cfd99f750 /core/hash
parent7a045bd95770d5c9624963dd9b8bb8a614940841 (diff)
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
Diffstat (limited to 'core/hash')
-rw-r--r--core/hash/crc.odin8
-rw-r--r--core/hash/hash.odin4
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;