我正在寻找类似哈希函数的东西,但是它的输出越近,两个不同的输入越接近?
类似的东西:
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
(示例输出仅用于演示目的)
所有输入数据的长度都相同。
我想在一个文件和许多其他文件之间进行比较,并且能够确定哪个文件与其他文件的差异最小。
答案 0 :(得分:1)
您可以尝试此算法。 http://en.wikipedia.org/wiki/Levenshtein_distance
因为这只是字符串。 您可以将所有二进制文件转换为字符串 例如: 0 - > “00000000” 1 - > “00000001”
答案 1 :(得分:1)
您可能对simhashing或shingling感兴趣。
如果您只是想要检测文档之间的相似性,那么还有其他技术可能更适合您(例如TF-IDF。)第二个链接是一本好书的一部分,其他章节深入研究一般信息检索主题,包括这些其他技术。
答案 2 :(得分:0)
您可能希望查看源代码以解析Python中的cmp
或FileCmp
等实用程序,并使用它来尝试确定合理的算法。
在我不知情的意见中,计算哈希值可能不会很好。首先,计算哈希值可能很昂贵。其次,你想要做的事情听起来更像是编码工作而不是哈希;一旦你开始这样思考,就不清楚它是否值得以这种方式改变文件。
如果您有一些约束,指定它们可能很有用。例如,如果所有文件的长度完全相同,则可能会简化操作。或者,如果您只对相同位置的位之间的差异感兴趣,并且只对比较不同位置的位而对相似的东西不感兴趣(例如,两个文件相同,除了一个位置已经移位了三位 - 应该是被认为是相似还是不相似?)。
答案 3 :(得分:0)
你不应该使用哈希。
您必须计算包含多个特征值的签名,例如:
其他更复杂的一样:
然后你可以比较签名。
但最重要的是要知道这些文件中的数据类型。如果是图像,则尺寸和主色更重要。如果它是合理的,你只能分析一些频率......
答案 4 :(得分:0)
您可以计算两个文件的XOR的总体数,这正是两个文件之间不同的位数。所以它正是你所要求的,没有近似值。
答案 5 :(得分:0)
您可以将数据表示为功能的二元向量,然后将 dimensionality reduction 与SVD或random indexing一起使用。
答案 6 :(得分:0)
您正在寻找的是各种文件指纹。对于纯文本,像Nilsimsa(http://ixazon.dynip.com/~cmeclax/nilsimsa.html)这样的东西运行得相当好。
这种技术有多种不同的名称。模糊散列/局部敏感散列/基于距离的散列/维数减少等等。工具可以生成固定长度的输出或可变长度输出,但输出通常是可比较的(例如通过levenshtein距离),类似的输入产生类似的输出。
nilsimsa上面的链接提供了两个类似的垃圾邮件,下面是示例输出:
773e2df0a02a319ec34a0b71d54029111da90838cbc20ecd3d2d4e18c25a3025 spam1
47182cf0802a11dec24a3b75d5042d310ca90838c9d20ecc3d610e98560a3645 spam2
* * ** *** * ** ** ** ** * ******* **** ** * * *
Spamsum和sdhash对任意二进制数据更有用。还有专门针对图像的算法,无论是jpg还是png,它们都能正常工作。不同格式的相同图像不会被例如spamsum注意到。