c# - 查找文件重复项 - 最好是 C#

标签 c# hashcode

我试图在文件服务器上查找给定唯一文件的所有副本。这是我所做的:

  1. 获取唯一文件的哈希码。
  2. 将唯一文件的散列码与文件服务器上每个文件的散列码进行比较。如果相等,则添加到重复列表中。

这可以完成工作但需要很长时间(我的文件服务器上有 20 万个文件)所以我不得不考虑其他事情,这就是我所做的:

  1. 获取唯一文件的哈希码。
  2. 获取唯一文件的字节大小。
  3. 获取具有相同文件大小的所有文件的列表(这非常快,因为我不需要读取文件)
  4. 将唯一文件的哈希码与入围文件的每个文件进行比较。

这将完成任务所需的时间从几小时减少到 10 分钟,但这仍然不是很好,尤其是在尝试为一堆文件查找重复项时。每个文件搜索需要 10 分钟意味着 100 个文件将需要 16 个小时!

是否有比哈希码更好的唯一文件标识符?获取哈希码是这个过程中最耗时的事情。

谢谢,

最佳答案

通过哈希码搜索重复项绝对是最慢的方法;大量磁盘 I/O 和 CPU 处理。

我在这方面有一些经验,我们发现最快的方法是尽快删除文件:

  1. 按文件大小分组的短列表
  2. 逐字节比较每组所有文件的前 256 个字节。这应该会消除很多文件。
  3. 在第 2 步循环,但每次迭代时将缓冲区大小加倍(最大为 16K 左右)

在循环中打开/关闭所有这些文件句柄确实是一个轻微的开销,但不如完全读取所有文件那么多。

关于c# - 查找文件重复项 - 最好是 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25758365/

相关文章:

c# - 确定对象是否为 DateTime 而非 null 作为三元中的条件

c# - 如何写linq获取最近传入的事件记录

checksum - 为什么各种项目的下载都有哈希码或校验和?

java - 通过哈希检查元素是否存在于 HashSet 中

c# - 如何通过正则表达式验证mvc中的CNIC号

c# - JSON DeserializeObject 无法从 System.String 转换或转换为模型

c# - 存储数字的最大数据类型

java - 字符串池中的字符串创建时不允许重复,是否使用hashCode来检测是否重复?

java - hashCode唯一性

java - 在 Java 中对数组实例调用 hashCode()