2009-04-17 36 views
5

Đối tượng lấy từ HashAlgorithm như MD5CryptoServiceProvider có phương thức Dispose(), nhưng nó là riêng tư. Thay vào đó nó có một phương thức Clear() mà "Phát hành tất cả các tài nguyên" được sử dụng bởi nó..NET: Xử lý đối tượng HashAlgorithm

WTF?

Đây có phải là cách xử lý chính xác thuật toán HashAlgorithm không?

var hasher = new MD5CryptoServiceProvider(); 

byte[] hashCode = hasher.ComputeHash(data); 

hasher.Clear(); 

Ai đó muốn giải thích điều này với tôi? :)

+0

tôi khuyên bạn nên sử dụng một thuật toán băm quá nếu bạn có thể làm nhiều xét thấy các Băm MD5 không an toàn trong một số ứng dụng nhất định. Một lựa chọn tốt sẽ là SHA-family, giống như SHA 256. Chúng cũng có sẵn để sử dụng trong .NET. – Skurmedel

+0

Cuộc gọi tốt. Tôi nhớ đọc MD5 đã được chứng minh dễ bị tổn thương một vài năm trở lại. Geeze, điều này từ Wikipedia: "Ngày 18 tháng 3 năm 2006, Klima đã xuất bản một thuật toán [10] có thể tìm thấy một va chạm trong vòng một phút trên một máy tính xách tay, sử dụng phương pháp mà anh ta gọi là đường hầm." – core

Trả lời

3

Tìm bằng Reflector, phương pháp Clear của HashAlgorithm chỉ cần gọi phương thức riêng Dispose. Lý do để lộ một phương thức với tên Clear có lẽ chỉ là các nhà thiết kế của lớp nghĩ rằng nó sẽ là một tên phù hợp hơn cho một thuật toán băm. Bạn thấy các kiểu tương tự trong các phần khác của BCL, chẳng hạn như Close cho System.IO.Stream. Ngoài ra, thực hành tốt nhất ở đây là sử dụng khối using, sẽ tự động gọi phương thức riêng tư Dispose khi hoàn tất.

+0

Như đã đề cập bởi những người khác, tốt nhất nên sử dụng khối 'using', điều này giúp đơn giản hóa logic thử/cuối cùng cho bạn và được khuyến khích thực hành. – Noldorin

-4

Bạn nên để GC xử lý điều đó cho bạn. Đó là công việc.

Một số tài nguyên cần được xử lý, như kết nối DB và xử lý tệp, vì vậy hãy đặt các tài nguyên đó vào khối using (C#). Tuy nhiên, đây không phải là một trong những trường hợp đó.

+0

Thực ra, HashAlgorithm (và do đó MD5CryptoServiceProvider) * làm * thực hiện IDisposable, do đó chúng phải được xử lý đúng cách, hoặc bằng cách gọi phương thức Clear hoặc với khối 'using'. – Noldorin

+3

Chỉ vì lớp thực hiện IDisposable, không có nghĩa là nó cần phải được xử lý thủ công. Để mỗi riêng của mình mặc dù. –

+0

Không thực sự, nhưng thực tế là nó * không * thực hiện IDisposable hầu như luôn luôn mạnh mẽ biểu thị rằng nó phải được xử lý bằng tay bởi vì nó làm một số interop bản địa bên trong. GC cuối cùng sẽ có được xung quanh để xử lý nó ngay cả khi bạn không gọi một cách rõ ràng phương pháp, nhưng thời gian mà tại đó điều này xảy ra không được đảm bảo để được sớm – Noldorin

10

Trong khi phương pháp Dipose() là riêng tư, nếu bạn truyền nó đến IDisposable bạn có thể truy cập vào nó. Như những người khác đã nói, mặc dù, Clear() sẽ gọi nó cho bạn.

Một cách tiếp cận tốt hơn, tuy nhiên, là để gửi kèm theo tờ khai và và phân công của biến trong một sử dụng() khối:

byte[] hashCode; 

using(var hasher = new MD5CryptoServiceProvider()) 
{ 
    hashCode = hasher.ComputeHash(data); 
} 
Các vấn đề liên quan