2010-04-08 78 views
32

Trong khuôn khổ .NET có một vài cách để tính toán một băm MD5 có vẻ như, tuy nhiên có cái gì đó tôi không hiểu;Sự khác nhau giữa việc sử dụng MD5.Create và MD5CryptoServiceProvider là gì?

Sự khác biệt giữa những điều sau đây là gì? Điều gì khiến họ tách biệt với nhau? Chúng dường như tạo ra kết quả giống hệt nhau:

public static string GetMD5Hash(string str) 
    { 
     MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
     byte[] bytes = ASCIIEncoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

    public static string GetMD5Hash2(string str) 
    { 
     System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create(); 
     byte[] bytes = Encoding.Default.GetBytes(str); 
     byte[] encoded = md5.ComputeHash(bytes); 

     StringBuilder sb = new StringBuilder(); 
     for (int i = 0; i < encoded.Length; i++) 
      sb.Append(encoded[i].ToString("x2")); 

     return sb.ToString(); 
    } 

Trả lời

29

System.Security.Cryptography.MD5.Create() thực sự đang tạo MD5CryptoServiceProvider. Đó là lý do tại sao bạn thấy kết quả tương tự.

Nhìn vào định nghĩa MD5 là lớp cơ sở và nó trừu tượng. Tôi đoán họ đã thêm chức năng tạo công khai để dễ sử dụng.

public sealed class MD5CryptoServiceProvider : MD5 

public abstract class MD5 : HashAlgorithm 

Hãy xem các định nghĩa.

MD5 Đại diện cho lớp trừu tượng mà từ đó tất cả các triển khai của thuật toán băm MD5 kế thừa.

MD5CryptoServiceProvider Tính giá trị băm MD5 cho dữ liệu đầu vào bằng cách sử dụng triển khai được cung cấp bởi nhà cung cấp dịch vụ mật mã (CSP). Lớp này không thể được thừa kế.

+2

Bạn có thể coi phương pháp 'MD5.Create()' là một phương pháp nhà máy có thể tạo lại phiên bản 'MD5CryptoServiceProvider' ngày hôm nay nhưng có khả năng linh hoạt để trả về bất kỳ loại triển khai MD5 nào trong các phiên bản sau ? Đó là kiểu trả về là 'MD5', vì vậy nếu bạn muốn chương trình của bạn sử dụng triển khai mới nhất, thì hãy sử dụng phương thức' MD5.Create() '. – Ben

+0

Làm cách nào để C# trả về một thể hiện của một lớp trừu tượng? Tôi nghĩ toàn bộ mục đích của một lớp trừu tượng là nó không thể được khởi tạo, nhưng những đứa trẻ thừa kế của nó có thể. – silkfire

+0

MD5.Create() trả về MD5CryptoServiceProvider không phải là lớp trừu tượng MD5. –

11

Như Jason Rowe đã đề cập (vui lòng bỏ phiếu cho câu trả lời của mình, đây chỉ là một lời cảnh báo), không có sự khác biệt về chức năng. Tuy nhiên, có một sự khác biệt nếu bạn đang xem xét MD5Managed (hoặc bất kỳ lớp mã hóa nào với Managed trong tên). Các lớp Managed không được sử dụng khi các thuật toán mã hóa tuân thủ FIPS được kích hoạt thông qua Group Policy.

1

2 xu của tôi.

MD5 thêm một chút chi phí và nó là chậm hơn so vớiMD5CryptoServiceProvider

Tôi chỉ cần chạy một kiểm tra căng thẳng ít tạo 300k băm của một chuỗi: chậm

MD5CryptoServiceProvider: 00:00:01.1750834 
MD5: 00:00:01.6398959 

Gần 1,5 lần.

PS. Thử nghiệm trên máy tính xách tay lõi i7

Các vấn đề liên quan