Algorithm 将相似输入映射到相似输出的哈希函数?

Algorithm 将相似输入映射到相似输出的哈希函数?,algorithm,hash,hashcode,simhash,Algorithm,Hash,Hashcode,Simhash,是否存在一个哈希函数,其中输入的微小更改会导致输出的微小更改?例如,类似于: hash("Foo") => 9e107d9d372bb6826bd81d3542a419d6 hash("Foo!") => 9e107d9d372bb6826bd81d3542a419d7 <- note small difference hash(“Foo”)=>9e107d9d372bb6826bd81d3542a419d6 散列(“Foo!”)=>9e107d9d372bb6826bd81

是否存在一个哈希函数,其中输入的微小更改会导致输出的微小更改?例如,类似于:

hash("Foo") => 9e107d9d372bb6826bd81d3542a419d6
hash("Foo!") => 9e107d9d372bb6826bd81d3542a419d7 <- note small difference
hash(“Foo”)=>9e107d9d372bb6826bd81d3542a419d6

散列(“Foo!”)=>9e107d9d372bb6826bd81d3542a419d7一个简单的解决方案是对所有字节模块N进行异或运算。例如,对于64位散列,您需要异或(输入[0]^input[8]^input[16])+256*(输入[1]^input[9]^input[17])。
所以,“Foo”散列到“Foo\0\0\0\0”和“Foo!”散列到“Foo!\0\0\0\0”。

我不会称之为散列,因为散列的点正好相反。然而,鉴于您提出的输入小变化产生输出小变化的目标,我将考虑使用函数或算法。

我推荐Mark Manasse的

局部敏感哈希(LSH)降低了数据的维数 高维数据。LSH对输入项进行散列,以便相似的项 以高概率映射到相同的“桶”:

另见:

下面是DNA序列感知哈希的一个很好的例子:


这将是一个非常糟糕的散列算法……对于加密散列,是的,这将是糟糕的,但我想将其用于其他用途。我认为您需要提供更多关于此类函数预期用途的详细信息。肯定没有具有该属性的加密哈希函数,但可能您正在寻找不同的东西?您对输出中的“小更改”的定义是什么?编辑距离(将散列视为字符串)或数字的数学距离(将散列视为整数?)