String 如何为相似的输入创建相似的哈希?

String 如何为相似的输入创建相似的哈希?,string,algorithm,file,hash,comparison,String,Algorithm,File,Hash,Comparison,我想用文件创建一个数据库。为了方便地搜索这些文件,我想使用某种哈希技术。但是,我不仅要查找完全相同的文件,还要检查文件的某些部分是否相同(即,文件相似)。换句话说,相似的文件应该有相似的散列 这意味着这种散列不是真正的加密散列,因为不应该存在“雪崩效应”(雪崩效应意味着数据的每一位都会影响其他数据的所有其他位) 另一件事是散列不需要是单向的,因为它不用于securitypurposes,而是用于比较文件 所以本质上,我在寻找一种算法,它可以为每个唯一的输入创建一个唯一的散列: 几乎没有碰撞 为

我想用文件创建一个数据库。为了方便地搜索这些文件,我想使用某种哈希技术。但是,我不仅要查找完全相同的文件,还要检查文件的某些部分是否相同(即,文件相似)。换句话说,相似的文件应该有相似的散列

这意味着这种散列不是真正的加密散列,因为不应该存在“雪崩效应”(雪崩效应意味着数据的每一位都会影响其他数据的所有其他位)

另一件事是散列不需要是单向的,因为它不用于securitypurposes,而是用于比较文件

所以本质上,我在寻找一种算法,它可以为每个唯一的输入创建一个唯一的散列:

  • 几乎没有碰撞

  • 为相似的输入创建相似的输出

  • 比原始文件短(否则只需比较原始文件会更快)

我想把前两个字符加在一起,然后把第三个和第四个字符加在一起,等等。但是,这有很大的冲突,因为“1+4”和“2+2”是一样的,等等


我真的不知道如何开始。有人能告诉我吗?:)

这通常被称为问题,不容易解决;我会推荐这个算法(代码是)。

我目前正在使用ssdeep来实现同样的效果,我用它获得了非常好的效果


我还读到sdhash比ssdeep好。

这可能非常困难。如果你的工作是查找带有公共字节的文件,那么这一点就很好了。你可以创建一个压缩算法,然后进行排序。您将对所有压缩输入使用相同的频率表,以便使事情具有确定性。@DanD.:在本文中,这似乎是一个很好的链接它将有助于了解您所拥有的数据类型——理想的算法将根据数据的性质而有所不同。但对于一些一般性的想法,请查阅“Soundex”。并不是说你会使用Soundex本身,但这是你需要采取的一般方法。