感知哈希(pHash)
🖼️ `pkg/phash/phash.go` — 视觉去重与相似度。
pkg/phash 用感知哈希(perceptual hash)比较截图,发现视觉重复或微小变化,比逐像素对比快得多且对人眼变化敏感。
📁 源码:
pkg/phash/phash.go
核心类型与函数
| 符号 | 源码 | 说明 |
|---|---|---|
HashResult | L15 | 哈希结果(含距离/相似度) |
ComputeHash(path) | L23 | 单图计算 |
ComputeHashFromImage(img) | L31 | 从 image.Image 计算 |
ComputePerceptionHash(path) | L43 | 别名 |
CompareHashes(a, b) | L52 | 比较两哈希 |
HashToHex(h) | L67 | 哈希转十六进制 |
HexToHash(s) | L75 | 十六进制转回 |
算法流程
基于 goimagehash,默认 pHash(DCT):
用 pHash 比对"今日 vs 昨日"截图是否改版的时序:
相似度计算
CompareHashes 用汉明距离(不同位数)衡量差异:
相似度 = 1 - hamming_distance / 64
distance=0 → 完全相同 (相似度 1.0)
distance<5 → 视觉几乎相同
distance<10 → 高度相似
distance>20 → 明显不同HashResult 字段
| 字段 | 说明 |
|---|---|
Hash | 64bit 感知哈希 |
Hex | 十六进制表示 |
Distance | 与参照的距离 |
Similarity | 0~1 相似度 |
应用场景
- 去重:批量结果中过滤视觉重复页
- 变化监控:定期截图,距离>阈值即告警
- 克隆检测:钓鱼站常复刻正版视觉
- 回归:UI 变更前后对比
存储与恢复
哈希可存为十六进制串(SQLite/JSONL),需要时 HexToHash 还原再比较,无需保留原图。