Skip to content

感知哈希

🧮 截图相似度与聚类。

pkg/phash 基于图像感知哈希,实现去重与相似页面发现。

为什么用感知哈希

感知哈希把图像降为 64 位指纹,对缩放/压缩/轻微改动作鲁棒——同一页面的截图即使分辨率不同,哈希仍相近。比逐像素比对实用得多,适合"这个站和那个站是不是同一模板"这类判断。

哈希算法

函数算法说明
ComputeHashdHash差值哈希
ComputePerceptionHashpHash感知哈希(DCT)
ComputeAverageHashaHash均值哈希

每张截图自动计算并存入 Result.PerceptionHash(十六进制)。

距离与相似

go
func Distance(hash1, hash2 string) (int, error)
func DistanceFromValues(h1, h2 uint64) int
func IsSimilar(hash1, hash2 uint64, threshold int) bool

汉明距离越小越相似。threshold 控制判定阈值。

聚类

HashGroup 把相似哈希归同组,赋予 perception_hash_group_id

go
type HashGroup struct { ... }
func NewHashGroup() *HashGroup

入库后可按 group_id 查询相似页面。

原理

感知哈希把图像降为 64 位指纹,对缩放/压缩/轻微改动作鲁棒。

用途

  • 🔄 截图去重
  • 🎭 相似页面发现(模板站、钓鱼站)
  • 📈 改版检测(对比两次哈希距离)
  • 🗂️ 视觉聚类归档

查询示例

sql
-- 相似页面组
SELECT perception_hash_group_id, count(*), group_concat(host)
FROM screenshots
GROUP BY perception_hash_group_id
HAVING count(*) > 1;

扫描入库后比对哈希并归组、触发相似告警的时序:

下一步

基于 MIT 许可发布