假設我有一個包含500張照片的文件夾,我想檢查重複並刪除它們。MD5檢查文件夾中的重複文件?
下面的代碼我現在所擁有的:
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
這將是可行的發現在一個特定的文件夾重複MD5s,提供我環路它相應的?
假設我有一個包含500張照片的文件夾,我想檢查重複並刪除它們。MD5檢查文件夾中的重複文件?
下面的代碼我現在所擁有的:
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
這將是可行的發現在一個特定的文件夾重複MD5s,提供我環路它相應的?
爲了識別相同的文件,在任何操作系統上以任何編程語言創建哈希值都是可以的。但是,這很慢,因爲即使沒有必要,您也可以閱讀整個文件。
我會建議幾經查找重複:
存在散列衝突的風險。你不能用散列算法來避免它。由於MD5使用128位,風險爲1:(1 < < 128)(大致爲0.0000000000000000000000000000000000000001)爲兩個隨機文件。你獲得了大獎在全國抽獎四次成一排,只使用一個每星期彩票的機率,比獲得一個隨機對文件的哈希衝突好得多。
儘管散列衝突的概率提高了有點,如果您比較許多文件的散列。數學感興趣的人和實現哈希容器的人應該查找「生日問題」。單純的凡人在不使用密碼算法時都信任MD5哈希值。
非常感謝。我會這樣做。 –
using System;
using System.IO;
using System.Collections.Generic;
internal static class FileComparer
{
public static void Compare(string directoryPath)
{
if(!Directory.Exists(directoryPath))
{
return;
}
FileComparer.Compare(new DirectoryInfo(directoryPath));
}
private static void Compare(DirectoryInfo info)
{
List<FileInfo> files = new List<FileInfo>(info.EnumerateFiles());
foreach(FileInfo file in files)
{
if(file.Exists)
{
byte[] array = File.ReadAllBytes(file.FullName);
foreach(FileInfo file2 in files)
{
int length = array.Length;
byte[] array2 = File.ReadAllBytes(file2.FullName);
if(array2.Length == length)
{
bool flag = true;
for(int current = 0; current < length; current++)
{
if(array[current] != array2[current])
{
flag = false;
break;
}
}
if(flag)
{
file2.Delete();
}
}
}
}
}
}
}
你的代碼是什麼編程語言?你有什麼操作系統和文件系統?從理論上講,你可能有MD5衝突(兩個不同的文件具有相同的MD5);在那個不太可能的情況下,你需要逐字節比較文件。 –
我真的很抱歉,我完全忘記提到這一點。我正在使用Windows 7和C#。 –
我會按目錄中的大小對文件進行排序。然後,如果兩個文件的大小相同,我會按字節比較它們字節(無需MD5他們,你需要反正MD5碰撞比較字節)。順便說一句,你的問題可能是I/O綁定,而不是CPU綁定。 –