Show HN: SplatHash – BlurHash 和 ThumbHash 的轻量级替代方案
发布: (2026年2月28日 GMT+8 19:24)
3 分钟阅读
原文: Hacker News
Source: Hacker News
概览
将任意图像压缩至 16 字节——并重新构建它
SplatHash 将任意图像编码为恰好 16 字节(一个 22‑字符的 base64url 字符串),并在 0.067 ms 内解码回 32×32 的模糊预览。Go、TypeScript 和 Python 的实现产生的哈希在位级上完全相同。
列:原图 · SplatHash 32×32 · ThumbHash · BlurHash。重新生成:mise run compare。
安装
| 语言 | 安装命令 | 文档 |
|---|---|---|
| Go | go get github.com/junevm/splathash/src/go | README |
| TypeScript / JS | npm install splathash-ts | README |
| Python | pip install splathash-py | README |
Go 是参考实现。所有其他实现均已在位级上与其对齐验证。
基准测试
在 Intel Core i5‑9300H 上的 Go 基准(go test -bench=. -benchmem)。
| 特性 | SplatHash | ThumbHash | BlurHash |
|---|---|---|---|
| 解码时间 | 0.067 ms | 0.50 ms | 6.55 ms |
| 编码时间 | 3.53 ms | 0.86 ms | 445 ms |
| 解码分配次数 | 7 | 1,168 | 5 |
| 字节数 | 16 固定 | 25–37 | 20–25 |
| 字符串长度 | 22 字符 | 34–50 字符 | 27–30 字符 |
解码在每个页面加载时对每位用户都会运行。编码只在上传时运行。请优化解码性能。
BenchmarkEncodeSplatHash-8 303 3530083 ns/op 100760 B/op 29 allocs/op
BenchmarkEncodeThumbHash-8 1431 863553 ns/op 1015 B/op 6 allocs/op
BenchmarkEncodeBlurHash-8 3 445696421 ns/op 33358234 B/op 8 allocs/op
BenchmarkDecodeSplatHash-8 17182 67622 ns/op 29584 B/op 7 allocs/op
BenchmarkDecodeThumbHash-8 6559 503366 ns/op 58408 B/op 1168 allocs/op
BenchmarkDecodeBlurHash-8 171 6553100 ns/op 547552 B/op 5 allocs/op
对比
| 特性 | SplatHash | ThumbHash | BlurHash |
|---|---|---|---|
| 固定输出大小 | 是(16 字节) | 否 | 否 |
| 可存储为 128‑位整数 | 是 | 否 | 否 |
| 感知颜色空间(Oklab) | 是 | 否 | 否 |
| 空间局部化基 | 是(高斯) | 否 | 否 |
| 全局权重优化 | 是(Ridge) | 否 | 否 |
| 支持 Alpha 通道 | 是 | 是 | 否 |
| 跨语言位级一致性 | 是 | 否 | 否 |
| 可配置的质量‑大小权衡 | 否 | 否 | 是 |
工作原理
背景颜色 + 六个通过匹配追踪放置的高斯斑点,颜色通过 Ridge 回归优化,全部在 Oklab 空间中,打包为 128 位。完整规格请见:ALGORITHM.md。
开发
mise install # 安装固定版本的 Go 与 Node
mise run test # 运行所有测试(Go + TypeScript + Python)
mise run bench # Go 基准测试
mise run compare # 重新生成 docs/comparison.png
许可证
请参阅 LICENSE。
