我正在编写一个程序来查找文件的重复项。
我有两个文件夹,我必须在其中查找重复项。在最坏的情况下,我将不得不将所有文件相互比较。我想生成每个文件的校验和,比较校验和,然后如果校验和相等,则执行逐字节检查以确保文件完全相同。
问题是哪个校验和生成器会足够快,可以浪费时间,而不仅仅是逐字节检查?
您可以通过获取文件的完整列表然后按长度排序来减少必须进行的比较次数以及 I/O 的数量。如果两个文件的长度不同,则它们不能相同。因此,您可以消除大量文件,而无需执行任何I/O,除了获取目录信息之外,无论如何都必须获取目录信息。
如果只有两个长度相同的文件 X ,则不必计算这些文件的校验和。只需直接比较它们即可。
如果有三个或更多文件具有相同的长度,那么最好计算所有三个文件的校验和,比较校验和,然后在校验和匹配时逐字节比较。
首先,首先按长度对文件进行分组,正如 Jim Mischel 所说。
如果要比较的文件很大,则通过获取文件的前 n
个字节来计算您的代表(这就是校验和的全部)可能会更快。读取整个大文件以计算校验和以将其与前 n
个字节不同的另一个文件进行比较是低效的。从理论上讲,第一个n
字节确定文件与n
字节校验和一样唯一。(如果一定长度的所有可能文件的可能性相同,则会出现这种情况)
当然,如果要比较的文件很小,则读取整个文件的速度与读取其子集一样快。
任何校验和算法都可以。例如,您可以使用 MD5。您几乎不会浪费任何时间,因为 I/O 比计算校验和所花费的 CPU 时间慢得多。您也可以使用CRC32。
你说:"我有两个文件夹,我必须在其中找到重复项。我想在这里澄清一些事情。如果目标是查找重复的文件,那么文件是否位于一个、两个或 x 个文件夹中并不重要。假设你有 n 个文件,你需要按照 n 个日志 n 个比较的顺序来查找重复项。读取 n 个文件一次,计算它们的校验和,然后在 n 个日志 n 个时间内对校验和进行排序以查找重复项,这确实很有用。但请注意,您可以通过首先比较文件大小来避免这种情况,并且仅在比较 3 个或更多相同大小的文件时求助于校验和。这将大大加快您对重复项的搜索速度。