在前面讨论的三种图片识别的哈希算法,最后都是通过比较哈希的相似度,即汉明距离实现的。虽然比较两个hash值的汉明距离非常快,但受不住数据的爆发式增长,在海量的数据中找出两个相似的hash值,性能也会慢慢变差,显然这种最基本的顺序查找,无法扩展到数以亿计的数据中。
在图片的识别中,汉明距离在0~10之间认为是相似的。如果采用顺序查找,查询完的次数为1万次。
算法原理
如果把hash值分成11份,那么两个hash值相同,则必有一块区域是完全相同的。这个分法不太科学,我们可以把hash值分为8份,这样如果每部分都不相同,则汉明距离肯定大于8;相反,如果汉明距离小于8,则至少有一块是相同的。
按照这个原理,分以下步骤,可以对海量数据建立索引:
- 将64位hash值分成8等份。
- 调整上面64位hash,将任意一块作为前8位,总共有8个table
- 采用精确匹配的方式,查找前8位
- 如果查找到,再精确判断这里的hash值。
java实现
public class DIndex implements Serializable {
private static final long serialVersionUID = -4463444087393922139L;
List<Map<Integer, List<Long>>> index_store = new ArrayList<Map<Integer, List<Long>>>();