用于识别文件重复的可靠且快速的方法

时间:2014-09-15 19:03:45

标签: java file hash duplicates hashcode

我有一组不断增长的文件,必须确保没有重复。副本我的意思是在字节级别相同。

文件是从各种系统收集的,其中一些还提供了文件的哈希码(但有些没有)。某些文件可能存在于多个系统中,但只能导入一次。

我想避免不必要的文件传输,我认为我只是在实际复制之前比较哈希码。但是,正如我所说,其中一些系统不提供哈希码,有些使用我读过的MD5不再安全。

我的问题:

  • 比较用于确定相同文件的哈希码?
  • 当系统使用不同的哈希码时,我该怎么办?
  • 当系统不提供哈希码时,我该怎么办?

1 个答案:

答案 0 :(得分:4)

首先,最终证明两个文件相同的唯一方法是逐位比较它们。因此,如果要比较文件,则无法真正避免传输文件。因此,如果您需要绝对的确定性,您无法避免传输文件。除非你能对这些只是数学真理的文件做出某些假设。

然后我们有哈希函数。哈希函数试图做的是计算一些值,当文件不同时,这些值很可能是不同的。有多大可能取决于实际的功能,真正愚蠢的哈希函数可能会有十分之一的变化为不同的文件产生相同的哈希,对于一个好的哈希函数,这些变化非常小。对于md5,找到具有相同散列的两个不同文件的更改是2^128中的一个。我猜这对你的系统来说已经足够好了,所以你可以安全地假设当哈希是相同的时候文件是一样的。

现在提供安全哈希,并且md5被破坏了。散列函数不仅仅用作检查事物是否相同的快速方法。它们也用于加密系统以验证事物是否相同。仅在这种意义上md5被破坏,可以相对快速地生成具有特定md5散列的文件。如果你担心有人可能故意创建一个与另一个文件具有相同哈希值的文件来诱骗你跳过它,那么你就不应该依赖md5。但这似乎并非如此。如果没有人故意弄乱文件md5仍然可以正常工作。

所以对你的第一个问题,理论上没有,但实际上是的。

对于第二个问题,您应该计算可能用于本地存储的每个文件的所有不同哈希值。例如。计算md5哈希值和sha1哈希值(或者远程系统上使用的任何哈希值)。这样,您将始终使用正确类型的哈希来检查您已有的每个文件。

对于没有哈希的文件,您无法做任何事情以避免传输它们。在你做之前,你对这些文件一无所知。转移它们后,您仍然可以自己计算哈希值,以便快速检查是否有该文件。