export function base64Encode(value: string) { const bytes = new TextEncoder().encode(value) const binary = Array.from(bytes, (b) => String.fromCharCode(b)).join("") return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "") } export function base64Decode(value: string) { const binary = atob(value.replace(/-/g, "+").replace(/_/g, "/")) const bytes = Uint8Array.from(binary, (c) => c.charCodeAt(0)) return new TextDecoder().decode(bytes) } export async function hash(content: string, algorithm = "SHA-256"): Promise { const encoder = new TextEncoder() const data = encoder.encode(content) const hashBuffer = await crypto.subtle.digest(algorithm, data) const hashArray = Array.from(new Uint8Array(hashBuffer)) const hashHex = hashArray.map((b) => b.toString(16).padStart(2, "0")).join("") return hashHex } export function checksum(content: string): string | undefined { if (!content) return undefined let hash = 0x811c9dc5 for (let i = 0; i < content.length; i++) { hash ^= content.charCodeAt(i) hash = Math.imul(hash, 0x01000193) } return (hash >>> 0).toString(36) }