SFV/CRC32 校验和足够好并且足够快来检查常见的备份文件?

SFV/CRC32 checksum good and fast enough to check for common backup files?

我有 3 TB,超过 300,000 个各种大小的参考文件(每个大小为 20、30、40、200 兆),我通常会定期备份它们(不压缩)。几个月前,我丢失了一些文件,可能是由于数据退化(我在没有通知的情况下 "backup" 损坏的文件)。

我不关心安全性,所以不需要 MD5、SHA 等。我只是想确保我正在复制的文件是好的(相同的位和字节)并验证备份是否完好无损几个月后再次进行备份。

因此,我的需求是基本的,因为文件不是很重要,也不需要安全(没有敏感信息)。 我的疑问:format/method "SFV CRC/32" 是否可以快速满足我的需求?有比这更好更快的东西吗?我正在使用程序 ExactFile。

是否有比 SFV/CRC32 更快但没有缺陷的校验和?我尝试使用 MD5,但它很慢,而且由于我不需要数据安全性,所以我更喜欢 SFV/CRC32。尽管如此,这仍然很痛苦,因为有超过 300,000 个文件并且需要数小时才能对所有文件进行校验和,即使使用 CPU xeon 8 核 HT 和快速硬盘也是如此。

从数据完整性的角度来看,将所有文件合并为一个 .ZIP 或 .RAR 比让它们“散落”在文件夹和文件中有一些优势吗?

一些提示?

谢谢!

如果您可以在 "A few months ago, I lost some files" 中量化 "few" 和 "some"(其中 "few" 将被视为替换为 "every few" 以获得率),那么你可以计算误报的概率。但是,仅凭这些话,我会说,是的,32 位 CRC 应该适合您的应用程序。

至于速度,如果您有最新的 Intel 处理器,您可能有 CRC-32C 指令,它可以使计算速度快得多,大约提高了 15 倍。(有关某些信息,请参阅 this answer代码。)通过 运行 它可以在多个内核上更快。如果做对了,你应该受限于 I/O,而不是计算。

在这种情况下,将它们打包成 zip 或 rar 文件没有任何优势。事实上,如果那个文件的损坏导致您丢失所有内容,情况可能会更糟。

如果您没有获得每个内核每秒至少 250 MB 的吞吐量,那么您可能 I/O 或 memory-speed 受限。 CRC32 和 MD5 的原始散列速度高于此速度,即使在 decades-old 硬件上,假设 non-sucky 合理优化的实现。

看看 Crypto++ benchmark,其中还包含大量其他哈希算法。

Castagnoli CRC32 比标准 CRC32 或 MD5 更快,因为较新的 CPU 有针对它的特殊指令;使用该指令和大量支持代码(用于并行散列三个流,将部分结果与一些线性代数拼接在一起,等等。pp.)您可以将散列速度提高到大约 1 cycle/dword。 AES-based 由于特殊的 AES 指令,哈希在最近的 CPU 上也快如闪电。

但是,最终散列函数等待读取数据的速度有多快并不重要;尤其是在多核机器上,你几乎总是 I/O 被这样的应用程序束缚,除非你被小缓存和深内存缓存层次结构的延迟所破坏。

我会坚持使用 MD5,它不比 CRC32 慢,而且普遍可用,即使在最古老的机器上,几乎所有发明的编程 system/language。不要将其视为 'cryptographically secure hash'(现在不是,不再是),而是某种与 CRC32 一样快的 CRC128,但需要一些 2^64 哈希才能发生冲突,而不是像CRC32那样只有几万。

如果您想滚动一些自定义代码,那么 CRC 确实有一些优点:可以通过将子块的 CRC 与一些线性代数相结合来计算文件的 CRC。使用像 MD5 这样的一般哈希是不可能的(但你总是可以并行处理多个文件)。

有大量 ready-made 程序用于计算文件和目录的 MD5 哈希值 快速。我推荐 'deep' 版本的 md5sum + 表兄弟:md5deep and hashdeep which you can find on SourceForge and on GitHub.

Darth Gizka,感谢您的提示。现在我正在使用您指定的 md5deep 64。这很好。我以前用的ExactFile,2010年就停止更新了,还是32位的(没有64位的版本)。我对两者进行了快速比较。 ExactFile 创建 MD5 摘要的速度更快。但比较摘要,md5deep64 快得多。

正如您所说,我的问题是硬盘。对于备份和存储,我使用了三个 Seagate,每个 2 TB(7200rpm 64 兆缓存)。使用 SSD 过程会快得多,但是对于 TB 级的文件很难使用 SSD。

前几天,我在部分档案中做了程序:1 tera(约170,000个文件)。 ExactFile 花了大约六个小时来创建摘要 SFV / CRC32。我使用了我的一台新机器,配备了 i7 4770k(嵌入了 CRC32 指令,8 核 - 四实四虚,MB Gygabyte Z87X-UD4H,16 RAM)。

在整个文件的计算过程中,CPU 个内核几乎无法使用(3% 到 4%,最大 20%)。 HDD 被 100% 使用,但是,只达到了他速度功率的一小部分(sata 3),大部分时间为 70 MB / s,有时会下降到 30 MB / s,具体取决于正在计算的文件数量和防病毒软件在后台(我后来禁用了,因为我在复制大量文件时经常这样做)。

现在我正在测试一个使用二进制文件比较的复制程序。无论如何,我会继续使用 md5 摘要。感谢您提供信息,欢迎任何提示。