使用校验和进行文件比较

时间:2013-10-31 12:34:36

标签: c# algorithm file compare checksum

我正在编写一个程序来查找重复的文件。

我有两个文件夹,我必须找到重复的文件夹。在最坏的情况下,我必须将所有文件相互比较。我想要生成每个文件的校验和,比较校验和,然后如果校验和相等,则执行逐字节检查以确保文件完全相同。

问题是什么校验和生成器足够快以浪费时间而不是只是逐字节检查?

3 个答案:

答案 0 :(得分:6)

您可以通过获取文件的完整列表然后按长度排序来减少必须进行的比较次数以及I / O量。如果两个文件的长度不同,则它们不能相同。因此,除了获取目录信息之外,您可以在不执行任何I / O的情况下消除大量文件,无论如何都要获取目录信息。

如果只有两个长度相同的文件X,那么您不必为这些文件计算校验和。只是直接比较它们。

如果有三个或更多文件具有相同的长度,那么最好计算所有三个文件的校验和,比较校验和,然后在校验和匹配时进行逐字节比较。

答案 1 :(得分:2)

首先,按照Jim Mischel的说法,首先按长度分组文件。

如果要比较的文件很大,则可以通过获取文件的第一个n字节来更快地计算代表(这是校验和)。读取整个大文件以计算校验和以将其与第一个n字节中不同的另一个文件进行比较是低效的。 理论上,第一个n字节将文件唯一确定为n字节校验和。 (如果所有可能的文件都具有一定长度,则情况就是如此)

当然,如果要比较的文件很小,那么将整个文件作为其子集读取的速度就快。

答案 2 :(得分:0)

任何校验和算法都可以。例如,您可以使用MD5。由于I / O比计算校验和所花费的CPU时间慢,所以几乎不会浪费任何时间。您也可以使用CRC32

你说:“我有两个文件夹,我必须找到重复的文件夹。” 我想在这里澄清一些事情。如果目标是查找重复文件,那么文件是位于一个,两个还是多个文件夹中并不重要。假设您有n个文件,则需要按n log n比较的顺序查找重复项。读取n个文件一次,计算校验和,然后在n log n时间内执行一种校验和以查找重复项确实很有用。但请注意,您可以通过首先比较文件大小来避免这种情况,并且在比较3个或更多相同大小的文件时只能使用校验和。这将极大地加速您搜索重复项。