C# 通過比對哈希碼判斷兩個文件內容是否相同


1、使用System.security.Cryptography.HashAlgorithm類為每個文件生成一個哈希碼,然后比較兩個哈希碼是否一致。    

2、 在比較文件內容的時候可以采用好幾種方法。例如,檢查文件的某一特定部分是否一致;如果願意,你甚至可以逐字節讀取文件,逐字節進行比較。這兩種方法都是可以的,但在某些情況下,還是使用哈希碼算法更為方便。
 
哈希算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。
該算法為一個文件生成一個小的(通常約為20字節)二進制“指紋”(binary fingerprint)。從統計學角度看,不同的文件不可能生成相同的哈希碼。事實上,即使是一個很小的改動(比如,修改了源文件中的一個bit),也會有50%的幾率來改變哈希碼中的每一個bit。因此,哈希碼常常用於數據安全方面。要生成一個哈希碼,你必須首先創建一個HashAlgorithm對象,而這通常是調用HashAlgorithm.Create方法來完成的;然后調用HashAlgorithm.ComputeHash方法,它會返回一個存儲哈希碼的字節數組。
 
如何獲取文件的基本信息:
 可以使用FileInfo類的相關屬性
FileInfo.Exists:獲取指定文件是否存在;
FileInfo.Name,FileInfo.Extensioin:獲取文件的名稱和擴展名;
FileInfo.FullName:獲取文件的全限定名稱(完整路徑); 
FileInfo.Directory:獲取文件所在目錄,返回類型為DirectoryInfo; 
FileInfo.DirectoryName:獲取文件所在目錄的路徑(完整路徑);
FileInfo.Length:獲取文件的大小(字節數)
FileInfo.IsReadOnly:獲取文件是否只讀;
FileInfo.Attributes:獲取或設置指定文件的屬性,返回類型為FileAttributes枚舉,可以是多個值的組合;
FileInfo.CreationTime、FileInfo.LastAccessTime、FileInfo.LastWriteTime:分別用於獲取文件的創建時間、訪問時間、修改時間;  
 
利用哈希值判斷兩個文件內容是否相同  代碼如下:
只需要建立一個控制台應用程序即可。
 
 public static void CompareFile()
        {
            string p_1 = @"E:\readme_1.txt";
            string p_2 = @"E:\readme_2.txt";

            //計算第一個文件的哈希值
            var hash = System.Security.Cryptography.HashAlgorithm.Create();
            var stream_1 = new System.IO.FileStream(p_1, System.IO.FileMode.Open);
            byte[] hashByte_1 = hash.ComputeHash(stream_1);
            stream_1.Close();
            //計算第二個文件的哈希值
            var stream_2 = new System.IO.FileStream(p_2, System.IO.FileMode.Open);
            byte[] hashByte_2 = hash.ComputeHash(stream_2);
            stream_2.Close();

            //比較兩個哈希值
            if (BitConverter.ToString(hashByte_1) == BitConverter.ToString(hashByte_2))
                Console.WriteLine("兩個文件相等");
            else
                Console.WriteLine("兩個文件不等");

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM