是否存在二进制数据的哈希函数,当数据更相似时会产生更接近的哈希值?

时间:2012-03-04 22:42:52

标签: algorithm file compare

我正在寻找类似哈希函数的东西,但是它的输出越近,两个不同的输入越接近?

类似的东西:

f(1010101) = 0 #original hash

f(1010111) = 1 #very close to the original hash as they differ by one bit
f(0101010) = 9999 #not very close to the original hash they all bits are different

(示例输出仅用于演示目的)

所有输入数据的长度都相同。

我想在一个文件和许多其他文件之间进行比较,并且能够确定哪个文件与其他文件的差异最小。

7 个答案:

答案 0 :(得分:1)

您可以尝试此算法。 http://en.wikipedia.org/wiki/Levenshtein_distance

因为这只是字符串。 您可以将所有二进制文件转换为字符串 例如: 0 - > “00000000” 1 - > “00000001”

答案 1 :(得分:1)

您可能对simhashingshingling感兴趣。

如果您只是想要检测文档之间的相似性,那么还有其他技术可能更适合您(例如TF-IDF。)第二个链接是一本好书的一部分,其他章节深入研究一般信息检索主题,包括这些其他技术。

答案 2 :(得分:0)

您可能希望查看源代码以解析Python中的cmpFileCmp等实用程序,并使用它来尝试确定合理的算法。

在我不知情的意见中,计算哈希值可能不会很好。首先,计算哈希值可能很昂贵。其次,你想要做的事情听起来更像是编码工作而不是哈希;一旦你开始这样思考,就不清楚它是否值得以这种方式改变文件。

如果您有一些约束,指定它们可能很有用。例如,如果所有文件的长度完全相同,则可能会简化操作。或者,如果您只对相同位置的位之间的差异感兴趣,并且只对比较不同位置的位而对相似的东西不感兴趣(例如,两个文件相同,除了一个位置已经移位了三位 - 应该是被认为是相似还是不相似?)。

答案 3 :(得分:0)

你不应该使用哈希。

您必须计算包含多个特征值的签名,例如:

  • 文件名
  • 文件大小
  • 是二元/只是ascii
  • 日期(如果需要)

其他更复杂的一样:

  • 字节值的方差
  • 字节的平均值
  • 相同值位序列的平均长度(在压缩文件中没有长的相同位序列)
  • ...

然后你可以比较签名。

但最重要的是要知道这些文件中的数据类型。如果是图像,则尺寸和主色更重要。如果它是合理的,你只能分析一些频率......

答案 4 :(得分:0)

您可以计算两个文件的XOR的总体数,这正是两个文件之间不同的位数。所以它正是你所要求的,没有近似值。

答案 5 :(得分:0)

您可以将数据表示为功能的二元向量,然后将 dimensionality reduction SVDrandom indexing一起使用。

答案 6 :(得分:0)

您正在寻找的是各种文件指纹。对于纯文本,像Nilsimsa(http://ixazon.dynip.com/~cmeclax/nilsimsa.html)这样的东西运行得相当好。

这种技术有多种不同的名称。模糊散列/局部敏感散列/基于距离的散列/维数减少等等。工具可以生成固定长度的输出或可变长度输出,但输出通常是可比较的(例如通过levenshtein距离),类似的输入产生类似的输出。

nilsimsa上面的链接提供了两个类似的垃圾邮件,下面是示例输出:

773e2df0a02a319ec34a0b71d54029111da90838cbc20ecd3d2d4e18c25a3025 spam1
47182cf0802a11dec24a3b75d5042d310ca90838c9d20ecc3d610e98560a3645 spam2
 *  * ** *** * ** ** ** **     *  *******  **** **     *    *  *

Spamsum和sdhash对任意二进制数据更有用。还有专门针对图像的算法,无论是jpg还是png,它们都能正常工作。不同格式的相同图像不会被例如spamsum注意到。