比较C++中的两个文件

Comparing two files in C++

本文关键字:两个 文件 C++ 比较      更新时间:2023-10-16

我有一个函数,可以比较两个文件,看看它们是否相同。它逐字节读取文件,并检查它们是否相同
我现在遇到的问题是,对于大文件,这个函数需要相当长的时间。

检查文件是否相同的更好、更快的方法是什么?

当您的文件不相同时,它们可能具有相同的大小吗?如果不是,您可以立即确定文件大小(fseek到末尾,ftell确定位置),如果它们不同,则在不比较数据的情况下就知道它们不一样。如果大小相同,请记得从头开始。

如果您将文件读取到内存的大缓冲区中,并使用memcmp()比较每个缓冲区,您将提高性能。您不必一次读取整个文件,只需设置一个大的缓冲区大小,并从每个文件中读取该大小的块,用于循环中的每个比较迭代。memcpy函数将对32位值进行操作,而不是对8位字节进行操作。

如果您真的想要对两个文件进行强力比较,mmaping可能会有所帮助。

如果你知道你正在阅读的文件结构,请阅读独特的部分,这样你就可以快速识别它们(例如标题和相关的块/部分)。当然,在进行比较之前,您需要了解它的基本属性。

如果进行多次比较,则生成散列(或其他内容)。

以X大小的块读取文件。X大小可达1-10-50兆字节。在这些块上使用memcmp()

虽然有很多使用SHA或MD5的加密哈希函数的例子,但对于文件比较,最好使用非加密哈希,因为它会更快:

https://en.wikipedia.org/wiki/List_of_hash_functions#Non-密码散列函数

FNV哈希被认为可以快速满足您的需求:

https://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash

如果您不熟悉在谷歌上搜索有关"MD5"或"SHA"算法的哈希。哈希是检查文件一致性的有效方法之一。你只需要找到其中一个算法的实现并检查它们;例如:

if(md5(file1Path) == md5(file2Path))
    cout<<"Files are equal"<<endl;
else
    cout<<"Files are not equal"<<endl;