2014-01-25 38 views
0

假設我有一個包含500張照片的文件夾,我想檢查重複並刪除它們。MD5檢查文件夾中的重複文件?

下面的代碼我現在所擁有的:

using (var md5 = MD5.Create()) 
{ 
    using (var stream = File.OpenRead(filename)) 
    { 
     return md5.ComputeHash(stream); 
    } 
} 

這將是可行的發現在一個特定的文件夾重複MD5s,提供我環路它相應的?

+0

你的代碼是什麼編程語言?你有什麼操作系統和文件系統?從理論上講,你可能有MD5衝突(兩個不同的文件具有相同的MD5);在那個不太可能的情況下,你需要逐字節比較文件。 –

+0

我真的很抱歉,我完全忘記提到這一點。我正在使用Windows 7和C#。 –

+0

我會按目錄中的大小對文件進行排序。然後,如果兩個文件的大小相同,我會按字節比較它們字節(無需MD5他們,你需要反正MD5碰撞比較字節)。順便說一句,你的問題可能是I/O綁定,而不是CPU綁定。 –

回答

2

爲了識別相同的文件,在任何操作系統上以任何編程語言創建哈希值都是可以的。但是,這很慢,因爲即使沒有必要,您也可以閱讀整個文件。

我會建議幾經查找重複:

  1. 得到所有文件的大小
  2. 同等大小的所有文件:拿到第一,說的哈希值,1K字節
  3. 爲所有相同大小的文件和相同的第一個1k散列的文件:獲得整個文件的散列

存在散列衝突的風險。你不能用散列算法來避免它。由於MD5使用128位,風險爲1:(1 < < 128)(大致爲0.0000000000000000000000000000000000000001)爲兩個隨機文件。你獲得了大獎在全國抽獎四次成一排,只使用一個每星期彩票的機率,比獲得一個隨機對文件的哈希衝突好得多。

儘管散列衝突的概率提高了有點,如果您比較許多文件的散列。數學感興趣的人和實現哈希容器的人應該查找「生日問題」。單純的凡人在不使用密碼算法時都信任MD5哈希值。

+0

非常感謝。我會這樣做。 –

1
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(); 
         }      
        } 
       } 
      } 
     } 
    } 
}