PDA

View Full Version : Kiểm tra hai file có trùng nhau không



Cuni
10-09-2009, 11:00 AM
Bạn cần so sánh nội dung của hai file.
Tính mã băm của mỗi file bằng lớp HashAlgorithm, và so sánh các mã băm.
Có nhiều cách để so sánh file. Ví dụ, có thể khảo sát một phần của file để tìm dữ liệu giống nhau, hoặc đọc và so sánh từng byte một. Cả hai cách trên đều đúng, nhưng trong một số trường hợp, sử dụng mã băm sẽ thuận tiện hơn.
Một giải thuật băm sinh ra một dạng nhị phân đặc trưng cho file (với kích thước nhỏ, thường khoảng 20 byte). Có thể hai file khác nhau có cùng mã băm, nhưng khả năng này hầu như không xảy ra. Thực tế, cả những thay đổi nhỏ nhất (chẳng hạn, chỉ thay đổi một bit trong file nguồn) cũng có 50% khả năng thay đổi các bit trong mã băm. Do đó, mã băm thường được sử dụng để phát hiện dữ liệu bị sửa đổi.
Để tạo một mã băm, trước hết bạn phải tạo một đối tượng HashAlgorithm bằng phương thức chia sẻ HashAlgorithm.Create. Sau đó gọi HashAlgorithm.ComputeHash để nhận về mảng byte chứa mã băm.
Ví dụ dưới đây đọc hai tên file từ đối số dòng lệnh và kiểm tra hai file này có trùng nhau hay không:

Public Module FileCompare
Public Sub Main(ByVal args() As String)
If args.Length <> 2 Then
Console.WriteLine("Wrong number of arguments.")
Console.WriteLine("Specify two files.")
Else
Console.WriteLine("Comparing " & args(0) & " and " & args(1))
' Tạo đối tượng băm.
Dim Hash As System.Security.Cryptography.HashAlgorithm
Hash = System.Security.Cryptography.HashAlgorithm.Create( )
' Tính mã băm cho file thứ nhất.
Dim fsA As New FileStream(args(0), FileMode.Open)
Dim HashA() As Byte = Hash.ComputeHash(fsA)
fsA.Close()
' Tính mã băm cho file thứ hai.
Dim fsB As New FileStream(args(1), FileMode.Open)
Dim HashB() As Byte = Hash.ComputeHash(fsB)
fsB.Close()
' So sánh mã băm.
If BitConverter.ToString(HashA) = _
BitConverter.ToString(HashB) Then
Console.WriteLine("Files match.")
Else
Console.WriteLine("No match.")
End If
End If
Console.ReadLine()
End Sub
End Module
Trước khi so sánh, các mã băm được chuyển thành chuỗi. Bạn cũng có thể so sánh chúng bằng cách duyệt qua mảng và so từng byte.

(Sưu tầm)