在C+;中查找重复文件的最佳方法是什么+;? 我想在C++文件系统中找到重复的文件。是否有任何算法可以尽可能快地做到这一点?我需要创建一个多线程应用程序,或者我可以用一个线程来完成它? < P > 1)不要使用C++。您需要的所有工具都已经存在
2) 散列每个文件(例如,使用在C+;中查找重复文件的最佳方法是什么+;? 我想在C++文件系统中找到重复的文件。是否有任何算法可以尽可能快地做到这一点?我需要创建一个多线程应用程序,或者我可以用一个线程来完成它? < P > 1)不要使用C++。您需要的所有工具都已经存在,c++,algorithm,file,C++,Algorithm,File,2) 散列每个文件(例如,使用md5sum),并建立文件名、文件大小和散列值的索引* 3) 按哈希值排序,并查找哈希值和大小的重复对(例如,使用排序) 4) 对候选副本执行普通的diff 您可以通过一些工作来并行化步骤2),但会受到存储器I/O速度的限制。您可以将大型索引文件拆分为若干位,分别对它们进行排序,然后合并它们(sort-m) *)正如@frankc所说,实际上并不是对每个文件都进行散列,而是只对大小不唯一的文件进行散列。从基于大小的索引开始。你必须散列很多小文件,但只有很少几个大文件
md5sum
),并建立文件名、文件大小和散列值的索引*
3) 按哈希值排序,并查找哈希值和大小的重复对(例如,使用排序
)
4) 对候选副本执行普通的diff
您可以通过一些工作来并行化步骤2),但会受到存储器I/O速度的限制。您可以将大型索引文件拆分为若干位,分别对它们进行排序,然后合并它们(sort-m
)
*)正如@frankc所说,实际上并不是对每个文件都进行散列,而是只对大小不唯一的文件进行散列。从基于大小的索引开始。你必须散列很多小文件,但只有很少几个大文件。我会这样做:
- 扫描你感兴趣的目录,查看每个文件的大小;将成对的文件大小/路径存储在
,文件大小作为索引李>多映射中
- 然后,扫描
,查找每个键只有一个元素的bucket,即大小唯一的文件;这些肯定不能重复multimap
- 散列其余文件的内容,并执行与以前相同的操作(
,散列作为键,路径作为值)multimap
- 然后仅对具有相同哈希的文件执行实(字节/字节)比较
此外,由于您实际上不需要有一个已排序的容器,因此可以使用
unordered_multimap
,而不是multimap
,因为它应该有更快的查找时间,并且一旦您知道需要处理多少文件,您可以使用确定的最大元素数调用reserve
,我不同意Kerrek SB,我认为,有比C++更有效的工具,但是,假设你真的需要在C++中这样做,这里有一些建议和要在你的实现中考虑的事情:
通常只有一个线程执行IO,因为HDD不能同时访问磁盘(不确定SSD)。要找到重复项,请比较散列,通常是MD5或SHA1。相关问题:您能再详细说明一下吗?是否要搜索整个磁盘,以查看任何目录中的任何文件是否与驱动器上的任何其他文件重复?是否需要文件系统访问、算法或两者的帮助?是否要搜索整个磁盘,以查看任何目录中的任何文件是否与驱动器上的任何其他文件重复?对的您需要文件系统访问、算法或两者的帮助吗?我需要算法方面的帮助,但如果您能帮助我访问文件系统,我将不胜感激:)我不想使用它,但它是任务的一部分;)。所以我需要一个单线程,对吗?不确定第2步如何并行。大部分时间都花在IO上。顺便问一下,我可以散列非文本文件(例如*.avi或*.mp3)吗?“按排序”ehmm。。。只需通过哈希值(或哈希值+文件大小)(例如:列表字典)进行索引,这样就不必排序。正如@frankc所说,您可能应该首先对文件大小进行索引,并且只计算这些候选文件的哈希值。+1-首先按文件大小进行绝对是更好的方法!通过OpenSSL库查找文件哈希的最佳方法是什么?查找文件哈希的功能可以应用于所有文件还是仅应用于txt文件?是的,这可能很好。您可以在这里看到如何计算MD5SUMMS:此应用程序不需要加密安全的哈希,除非有人故意愚弄您的扫描仪会导致安全问题(如自动删除重复项等)