-1

对不起,我的英语不好,我有一个包含照片散列的小型数据库,当我尝试找到与以下类似的照片时:

为其计算了以下哈希:“0f3f2764ecc482c2”,使用方法 average_hash()

imagehash.average_hash(Image.open(imagePath))

系统发现了大量的碰撞,下面是被识别为完全相同的照片示例:

我存储照片哈希的表:

CREATE TABLE IF NOT EXISTS photos(id_photo BIGINT PRIMARY  KEY,  photo_hash TEXT,  FOREIGN KEY (id_photo) REFERENCES users (id));

添加哈希:

cur.execute('''INSERT INTO photos(id_photo, photo_hash) VALUES(%s, %s)''', id, str(result_image_recognition['photo_hash'])])

SQL Query 通过它计算我的哈希和存储的哈希之间的欧几里得距离:

SELECT id_photo, BIT_COUNT(photo_hash ^ '0f3f2764ecc482c2') FROM photos;

照片表包含 7889 张照片,其中 959 张被此查询错误地确定为完全相同(欧几里得距离为 0)。大约一个星期我无法解决这个问题,请有人帮助我。

4

1 回答 1

1

在进行异或运算之前,您需要将十六进制字符串转换为整数

SELECT id_photo, BIT_COUNT(CONV(photo_hash, 16, 10) ^ CONV('0f3f2764ecc482c2', 16, 10)) FROM photos;

因为所有第一个字符不是 1-9 的字符串都被转换为 0。

mysql> select 'abc' ^ 'def'; # -> 0
mysql> select CONV('abc', 16, 10) ^ CONV('def', 16, 10);  # -> 1875
于 2021-10-03T14:07:52.893 回答