Show HN: SplatHash – BlurHash와 ThumbHash에 대한 가벼운 대안
Source: Hacker News
개요
이미지를 16바이트로 압축하고 복원합니다
Algorithm · Demo · Bugs · Contributing
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) | 아니오 | 아니오 |
| 알파 채널 지원 | 예 | 예 | 아니오 |
| 언어 간 비트‑정확도 | 예 | 아니오 | 아니오 |
| 품질 대비 크기 조정 가능 | 아니오 | 아니오 | 예 |
작동 원리
배경색 + 매칭 퍼슈트를 통해 배치된 여섯 개의 가우시안 블롭, Ridge Regression으로 색 최적화, 모두 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를 확인하세요.
