如果您只想删除整个重复文件,则该任务很容易实现。
您将必须浏览所有文件夹并对每个文件的内容进行哈希处理。产生的散列有一些位(例如 32 到 256 位)。如果两个文件哈希值相等,则各个文件相同的概率极高(取决于哈希函数的抗碰撞性,读取的位数)。
当然,现在实现取决于您(我不是 C# 或 VB 程序员),但我建议您使用类似以下伪代码的内容(接下来我会解释每个步骤并为您提供演示如何在 C# 中执行此操作的链接) :
do{
file_byte_array = get_file_contents_into_byte_array(file) 1
hash = get_hash from_byte_array(file_byte_array); 2
if(hashtable_has_elem(hashtable,hash)) 3
remove_file(file); 4
else 5
hashtable_insert_elem(hashtable,hash,file); 6
}while_there_are_files_to evaluate 7
此逻辑应在所有.pst文件上执行。在第 1 行(我假设您打开了文件),您将文件的所有内容写入字节数组。
获得文件的字节数组后,必须使用散列函数(第 2 行)对其进行散列。您有大量的哈希函数实现可供选择。在某些实现中,您必须将文件分成块并散列每个块的内容(例如here、here和here)。如果您的文件真的很大并且不适合您的记忆,那么将文件分成几部分可能是唯一的选择。另一方面,您有许多接受整个流的函数(例如,这里,这里是与您的问题非常相似的示例,这里,这里,但我建议您使用超快的MurmurHash3)。如果您有效率要求,请远离加密哈希函数,因为它们要重得多,并且您不需要加密属性来执行任务。
最后,在计算完散列之后,您只需要获取一些保存散列并比较它们的方法,以便找到相同的散列(读取文件)并删除它们(第 3-6 行)。我打算使用哈希表或字典,其中标识符(用于执行查找的对象)是文件哈希,对象 File 是条目值。
笔记:
记住!!!: 哈希值的位数越多,冲突的可能性就越小。如果您想了解更多关于散列函数中的碰撞概率的信息,请阅读这篇出色的文章。您必须注意此主题,因为您的目标是删除文件。如果发生冲突,那么您将删除一个不相同的文件,并且您将永远丢失它。有许多策略可以识别冲突,您可以将它们组合起来并添加到您的算法中(例如比较文件的大小、比较随机位置的文件内容值、使用多个哈希函数)。我的建议是使用所有这些策略。如果您使用两个散列函数,那么对于两个被认为相同的文件,它们的每个散列函数的散列值必须相等:
file1, file2;
file1_hash1 = hash_function1(file1);
file2_hash1 = hash_function1(file2);
file1_hash2 = hash_function2(file1);
file2_hash2 = hash_function2(file2);
if(file1_hash1 == file2_hash1 &&
file2_hash2 == file2_hash2)
// file1 is_duplicate_of file2;
else
// file1 is_NOT_duplicate_of file2;