Files
ww/lib/hash/crc64/crc64.ww
Hojun-Cho aadc6618f0 lib: banner purge + WHY-only comment sweep (rule 8)
Every // ---- section banner dies (132 -> 0): names carry the WHAT.
Narration deleted (filename restatements, run-with lines, what-the-
next-line-does); every ref/hare cite, task cite, divergence, ABI/
layout contract, and ownership qualifier kept (borrowed-view lines
restored where the sweep over-cut). Comment-only proven: all 442
walk-workdir .s and 32 import-probe .s byte-identical before/after;
libbyteid 56-roster all-ID.
2026-08-08 21:10:18 +09:00

35 lines
981 B
Plaintext

// Same shape as lib/hash/crc32: per-byte inline polynomial shift, no
// precomputed table. Slower than Hare's table-driven path by ~8x per
// byte but produces identical answers for the documented polynomials.
//
// Polynomials are given in reversed form, matching Hare.
package crc64;
def ECMA: u64 = 0xC96C5795D7870F42u64; // ECMA-182, xz-utils
def ISO: u64 = 0xD800000000000000u64; // ISO 3309 HDLC
// sum64 — fold `buf` under `poly` (reversed form). Initial cval is ~0u64.
export fn sum64(buf: []u8, poly: u64) u64 = {
let c: u64 = 0xFFFFFFFFFFFFFFFFu64;
let i: i32 = 0;
for (i < buf.len) {
let t: u64 = (c & 0xFFu64) ^ (buf[i]: u64);
let z: i32 = 0;
for (z < 8) {
if ((t & 1u64) == 1u64) {
t = (t >> 1u64) ^ poly;
} else {
t = t >> 1u64;
};
z += 1;
};
c = t ^ (c >> 8u64);
i += 1;
};
return ~c;
};
export fn sum64ecma(buf: []u8) u64 = { return sum64(buf, ECMA); };
export fn sum64iso(buf: []u8) u64 = { return sum64(buf, ISO); };