2017-05-13 22 views
0
 public static string GetMD5HashFromFile(string fileName) 
     { 
      using(var md5 = MD5.Create()) 
      { 
       try 
       { 
        using(var stream = File.OpenRead(fileName)) 
        { 
         byte[] HashArray; 
         StringBuilder sb = new StringBuilder(256); 
         int i = 0; 
         sb.Append("0x"); 

         HashArray = md5.ComputeHash(stream); 

         for(i = 0; i < HashArray.Length; i++) 
         { 
          sb = sb.Append(String.Format("{0:X2}", HashArray[i])); 
         } 
         return sb.ToString(); 
        } 
       } 
       catch(Exception) 
       { 
        return null; 
       } 
      } 
     } 

我想使用上面的GetMD5HashFromFile函數來獲取文件的哈希值,並檢查它們是否相同。如何檢查拖拽docx文件是否相同?

我創建了1.docx文件,並保存爲2.docx,我發現這兩個文件的散列不一樣。我不知道爲什麼,有人可以問我爲什麼,或給我一個小費來解決我的問題。

+1

Docx文件本質上是Zip檔案。很可能,第二個文件中的Zip文件條目具有不同的日期/時間戳。根據您用來編寫docx文件的應用程序,也可能是第二個docx文件包含不同的元數據(例如關於上次保存/修改文檔的時間,文檔的作者,用於寫入的應用程序docx等等)比第一次docx。 – elgonzo

+0

僅供參考1:初始化StringBuilder,初始容量爲256個字符。請注意,MD5是128位長或16字節。要以十六進制表示法表示16個字節,您只需要32個字符。所以你可以初始化你的StringBuilder,初始容量爲32. – elgonzo

+0

僅供參考2:StringBuilder本身具有AppendFormat(...)重載格式字符串。所以你不需要使用string.Format,但可以簡單地做'sb.AppendFormat(「{0:X2}」,HashArray [i]);' – elgonzo

回答

0

thx elgonzo,但您的提示並不能解決問題。 至少我知道這是一個zip文件,並解壓縮它,我得到的document.xml,我發現不同的位置是不同的。 different between two xml

我寫一些代碼:

  string aLastName = fileName.Substring(fileName.LastIndexOf(".") + 1, 
      (fileName.Length - fileName.LastIndexOf(".") - 1)); 
     if (aLastName.ToLower() == "docx") 
     { 
      WordprocessingDocument doc = WordprocessingDocument.Open(fileName, false); 
      string strText = doc.MainDocumentPart.Document.InnerText; 

      return GetMD5HashFromStream(String2Stream(strText)); 
     } 

但我不認爲這是一個好主意,因爲XML可以知道它是一樣的。