如何有效地识别二进制文件

时间:2010-08-14 12:07:03

标签: algorithm language-agnostic file performance identifier

识别二进制文件的最有效方法是什么?我想从二进制文件中提取某种签名,然后用它来与其他文件进行比较。

蛮力方法是将整个文件用作签名,这将花费太长时间和太多内存。我正在寻找一种更聪明的方法解决这个问题,我愿意为性能牺牲一点精度(但不要太多,不要太多)。

(虽然首选Java代码示例,但鼓励使用与语言无关的答案)

编辑:扫描整个文件以创建哈希的缺点是文件越大,所需的时间越长。由于散列不是唯一的,我想知道是否有更有效的方法(即:来自均匀分布的字节采样的散列)。

4 个答案:

答案 0 :(得分:11)

我发现这种方法有效的方法是计算两个SHA-1哈希值。一个用于文件中的第一个块(我任意选择512个字节作为块大小),一个用于整个文件。然后,我将两个哈希值与文件大小一起存储。当我需要识别文件时,我首先要比较文件长度。如果长度匹配,那么我将比较第一个块的散列,如果匹配,我比较整个文件的散列。前两个测试很快就淘汰了很多不匹配的文件。

答案 1 :(得分:3)

这就是hashing的用途。请参阅MessageDigest

请注意,如果您的文件太大而无法在内存中读取,那就没问题,因为您可以将文件的块提供给哈希函数。例如,MD5和SHA1可以采用512位的块。

此外,具有相同散列的两个文件不一定相同(尽管它们不是很少),但是两个相同的文件必须具有相同的散列。

答案 2 :(得分:2)

通常的答案是使用MD5,但我想建议在现代应用程序中使用MD5的冲突太多:http://www.mscs.dal.ca/~selinger/md5collision/

SHA-1在十多年前取代了MD5。

NIST在2005年建议在2010年之前使用SHA-2来代替SHA-1,因为已经完成的工作是为了证明SHA-1的减少变体的冲突。 (这是非常好的远见,因为它是now known需要2 ^ 51次工作来找到理想情况下需要2 ^ 80工作才能找到碰撞的碰撞。)

所以请根据你想要做的,以及你可能需要与之互操作的其他程序,在MD5中选择(请不要),SHA-1(我明白了,但我们可以做得更好)和SHA-2(接我!接我!)。

答案 3 :(得分:0)

您是否考虑使用标头识别。 如果您可以这样设计文件,这将是快速和可靠的。 使用一个字节可以区分255种文件类型;)