磁盘清理里最实在的一块是找重复文件:照片导了两遍、下载目录和文档目录有同一份 PDF、备份目录里躺着历史版本的全家福。按文件名找是不可靠的,按内容找才准——而”按内容”这件事,工程上就是哈希。这篇文章把重复文件检测的完整思路走一遍,从筛选策略到索引设计,再到清理的安全流程。 一、文件名不可靠,内容才算数 重复文件的定义是”内容完全相同的文件”,而不是”名字相同的文件”。现实中的重复文件形态五花八门: 同名同内容:报告.docx 在两个目录各一份 同名不同内容:报告.docx 是不同版本,名字一样内容不同——这不是重复,不能删 不同名同内容:最终版.pdf 和 copy2.pdf 是同一份文件的两次落盘 所以判断重复的唯一可靠依据是内容。比对内容的朴素做法是逐字节比较,但两两比较的开销是 O(n²),几百个文件就跑不动了。正确做法是给每个文件算一个内容哈希(MD5、SHA-1、SHA-256 都可),哈希相同即视为内容相同——这把比对降到了 O(n) 的哈希计算加 O(n) 的哈希查找。 二、先按大小初筛:砍掉 99% 的工作量 全量哈希的问题是慢。对大目录里的视频、镜像文件,读一遍磁盘算哈希就是几分钟到几小时的 IO。工程上的第一刀是按文件大小分组: 内容相同的文件,大小一定相同。 所以先按 size 建桶,只有同桶的文件才有必要进下一步比较。一个典型的场景是十万个文件里有几百组同大小候选——99% 以上的文件在这一层就被排除了,一次 stat 就够,不用读内容。 大小这一层还能再细化:取文件头尾的少量字节做”局部哈希”(比如首 4KB + 尾 4KB),作为第二层筛选。头部尾部不同,内容必然不同;头尾相同再进全量哈希。对大文件特别有效——几兆的局部读取远比几百兆的全量读取便宜。 候选 = 所有文件 候选 = 按 size 分桶,桶内 >= 2 的进下一轮 候选 = 按 头尾采样哈希 分桶,桶内…










