由 Rust + WebAssembly 手写 SHA-256,文件完全在本地计算,不会上传
—
将任意文件拖放到此处,或点击选择
大文件按 4 MB 分块流式计算,内存占用很小
计算完成后会再用浏览器内置的 Web Crypto 算一遍,交叉验证结果并对比速度
SHA-256 把任意长度的数据压缩成一个 256 位(64 个十六进制字符)的「指纹」。输入哪怕只改变 1 个比特,输出也会面目全非;而且无法从指纹反推原文,也几乎不可能找到两份指纹相同的不同数据。下载文件后核对校验值、Git 的对象 ID、比特币挖矿用的都是这类哈希函数。这里的 SHA-256 完全按照 FIPS 180-4 标准用 Rust 手写,文件只在你的浏览器里计算,不会上传。
0x80 字节、若干个 0,再以大端序写入原始消息的比特长度(64 位),使总长度正好是 64 字节的整数倍。如果最后一块剩余空间不够放下长度字段,就要多补一整块,测试里 448 位的 NIST 向量正是这种情况。W₀…W₆₃。Kᵢ(前 64 个素数立方根的小数部分)。所有加法都按 2³² 取模,在 Rust 里写成 wrapping_add。sha256_init → 多次 sha256_update → sha256_finish。无论文件多大,内存占用都只取决于每次读取的块大小(4 MB)。TextEncoder 把文字转成 UTF-8 字节,调用一次性函数 sha256_hex()。File.slice() 每次读取 4 MB,转成 Uint8Array。sha256_update(块),Rust 在全局状态中累积压缩结果;全部读完后调用 sha256_finish(),完成填充并返回十六进制字符串。crypto.subtle.digest('SHA-256', …) 计算一遍,比较两者的结果和速度。「生成并计算」会用 xorshift 生成确定性的伪随机数据,每次运行的哈希值都相同,方便在没有大文件时测试。
chunks_exact),不经过缓冲区复制;只有块边界上不满 64 字节的部分才进入内部缓冲。源码crates/tools/sha256/src/lib.rswww/sha256/index.js