我的数据库中有一个表,我将 SHA256 哈希存储在 BINARY(32) 列中。我正在寻找一种方法来计算列中的条目到提供的值的汉明距离,例如:
SELECT * FROM table
ORDER BY HAMMINGDISTANCE(hash, UNHEX(<insert supplied sha256 hash here>)) ASC
LIMIT 10
(如果您想知道,字符串 A 和 B 的汉明距离定义为BIT_COUNT(A^B)
,其中 ^ 是按位异或运算符,BIT_COUNT 返回二进制字符串中 1 的数量)。
现在,我知道 ^ 运算符和 BIT_COUNT 函数都只适用于 INTEGER,所以我想说可能唯一的方法是将二进制字符串分解为子字符串,将每个二进制子字符串转换为整数,计算汉明距离子串,然后添加它们。这样做的问题是它听起来非常复杂,效率不高,而且绝对不优雅。因此,我的问题是:您能提出更好的方法吗?(请注意,我在共享主机上,因此无法修改数据库服务器或加载库)
编辑(1):显然在 PHP 中加载整个表并在那里进行计算是可能的,但我宁愿避免它,因为这个表可能会变得非常大。
编辑(2):数据库服务器是 MySQL 5.1
编辑(3):我下面的答案包含我刚才描述的代码。
编辑(4):我刚刚发现使用 4 个 BIGINT 来存储哈希而不是 BINARY(32)会产生巨大的速度提升(快 100 倍以上)。请参阅下面对我的答案的评论。