0

我需要将目录A中的文件同步到目录B。我检查A中的文件,然后将它们与B中的文件一一进行比较。如果在 B 中找到与 A 同名的文件,我通过比较它们的大小来检查文件是否不同。如果文件大小不同,我会记录并继续下一个文件。但是,如果文件大小相同,我还需要验证文件的内容是否不同。为此,我想创建两个文件的哈希值并进行比较。这更好还是我应该逐字节比较文件?还请说明您为什么要选择其中一种方法。

我正在使用 C# (.NET 4) 并且需要保留 B 上的所有文件,同时复制 A 上新添加的文件并报告(并跳过)任何重复项。

谢谢。

编辑:这项工作将每晚运行,我可以选择仅在目录 B 上存储文件的哈希值,目录 A 将被动态填充,因此我无法对这些文件进行预哈希处理。此外,哪种哈希算法更适合此目的,因为我也想避免哈希冲突。

4

3 回答 3

1

如果您需要同步文件,您可以比较另一件事:文件日期 - 如果有任何不同,则文件很可能已更改。

此外,在大多数情况下,散列(我会选择 md5 或 sha1 - 而不是 crc,因为值范围有限,因此冲突相当频繁)就足够了。如果这些哈希值相等,您应该进行逐字节比较。当然,这是一个额外的步骤,但如果根本不需要它的话。

实际上,您应该将哈希保存在 B 上,因此您不需要每次都重新计算它,但您必须确保 B 上的文件在不更新其哈希的情况下无法更改。

于 2013-06-07T06:46:55.797 回答
0

如果您只使用哈希码来比较两个文件,那么如果哈希码不同,您可以确定文件不同。

但是如果哈希码相同,那么您不确定文件是否真的相同。

如果您使用 32 位散列码,那么即使散列码相同,文件不同的可能性为 2^32 分之一。对于 64 位哈希码,机会自然是 2^64 中的 1。

将所有文件的哈希码存储在 B 上将使初始比较速度更快,但是如果两个哈希码相同,您必须决定该怎么做。您是否冒险并假设它们都是相同的?还是在发现两个具有相同哈希值的文件后进行逐字节比较?

请注意,如果在计算文件的哈希码后进行逐字节比较,您最终将访问文件内容两次。如果大部分文件相同,这会使使用哈希码变慢。与以往一样,您必须进行一些计时才能看到哪个更快。

如果您可以忍受错误地假设两个文件相同的可能性很小,那么您可以避免确认比较……但我自己不想冒险。

总之,我可能只会每次都进行比较,而不用担心散列(除了您已经在比较文件名和大小方面所做的事情)。

请注意,如果您发现几乎所有按文件名和大小匹配的文件也是相同的,那么使用散列几乎肯定会减慢速度。

于 2013-06-07T06:35:10.727 回答
0

你已经在这里有了一个哈希函数。你的哈希函数是file-->(filename, filesize). 此外,由于目录中只能有一个具有给定文件名的文件,因此可以保证每次运行每个文件不会发生多次冲突。

你问你是否需要一个更好的。好吧,我不知道,你已经拥有的散列函数的性能是否足够?如果它对你来说足够了,你就不需要更好的散列函数。

于 2013-06-07T06:34:29.410 回答