import { createHash } from "node:crypto"; import fs from "node:fs"; export function sha256Bytes(data: Uint8Array): string { return createHash("sha256").update(data).digest("hex"); } export function sha256Text(value: string): string { return createHash("sha256").update(value, "utf8").digest("hex"); } export async function sha256File(filePath: string): Promise { const hash = createHash("sha256"); await new Promise((resolve, reject) => { const stream = fs.createReadStream(filePath); stream.on("data", (chunk) => hash.update(chunk)); stream.on("error", reject); stream.on("end", resolve); }); return hash.digest("hex"); } export function shortHash(value: string, length = 16): string { return sha256Text(value).slice(0, Math.max(0, Math.trunc(length))); } const CRC32_TABLE = (() => { const table = new Uint32Array(256); for (let index = 0; index < table.length; index++) { let value = index; for (let bit = 0; bit < 8; bit++) value = (value & 1) ? 0xedb88320 ^ (value >>> 1) : value >>> 1; table[index] = value >>> 0; } return table; })(); export function crc32(data: Uint8Array): number { let crc = 0xffffffff; for (const byte of data) crc = CRC32_TABLE[(crc ^ byte) & 0xff] ^ (crc >>> 8); return (crc ^ 0xffffffff) >>> 0; }