@
binux 建议重修义务教育语文,本帖标题为“有没有将近似的 hash 认为是相同 hash 的 hashset ?”,一般认为 hash 是字符串结构,标题含义为,传统 hashset 精确匹配,如何应对不精确匹配的情况,不知道你在杠什么。另外实际使用中图片去重就是要对抗模糊剪裁缩放。实际使用场景就是互联网上的图片来源,相同图片会被各种裁剪 /调整比例 /反复压缩,我不知道你是哪里的实际使用经验,去重时不需要考虑这些问题。
@
3dwelcome 老哥你是楼里唯一一个一直在认真回我的,我最后给你更新一下我的解决办法。首先我使用的 phash 算法没有进行 dct ,而是直接用 rgb 模式下的三平面的向量变化,也就是单个平面里面 8*8 向量的增加或减少来形成 hash 。我对我自己的场景做了一些小修改,因为我的图片大多为电脑或手机屏幕适配,通常为 16:9 或者 9 比 16 的近似比例,我把 8*8 稍微扩大了一些。
关于近似去重,最后采用的是多年前谷歌的近似 simhash 搜索的简化方法,需要储存结构做对应优化。其原理是,如果要求一个长度为 64 (或任意)的 binary ,与另一个等长 binary 的汉明距离小于 3 (意味着他们之间有 0 处或 1/2/3 处不同),那么只需要将 64 平均分割为 4 段,即使出现 3 处不同,4 段中的某一段一定完全相同。同理,如果要求距离小于 20 ,则平均分割为 21 段。将其转化为完全相同问题后,可以利用 hash 结构的索引能力,原先需要遍历十万次对比,现在只需要进行 4 次索引,挑选出完全相同的集合的并集,他们之中有可能存在不符合需求的结果,但符合需求的(汉明距离小于 3 )一定在其中,在此基础上进行完全搜索,即可精准定位。
使用这个方法后,原先的 100k 数量级对象总共需要进行 5 亿次遍历(加上我的向量数量为 800+,总计需要 4000 亿次向量相等计算),可以优化到非常低的水平,我目前的数据集大小是可以 1s 内出结果的,优化之前速度非常慢。