2009-04-17 3 views
5

Objekte, die von HashAlgorithm wie MD5CryptoServiceProvider abgeleitet sind, verfügen über eine Dispose() - Methode, die jedoch privat ist. Stattdessen verfügt es über eine Clear() - Methode, die "Alle Ressourcen freigibt", die von ihr verwendet wird..NET: Disposition eines HashAlgorithm-Objekts

WTF?

Wie kann man dann einen HashAlgorithm korrekt entsorgen?

var hasher = new MD5CryptoServiceProvider(); 

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

hasher.Clear(); 

Will mir jemand diesen erklären? :)

+0

Ich empfehle Ihnen auch einen anderen Hash-Algorithmus zu verwenden, wenn Sie so viele der erachten kann MD5 Hash ist in bestimmten Anwendungen nicht sicher. Eine gute Alternative wäre die SHA-Familie, wie SHA 256. Sie sind auch für .NET verfügbar. – Skurmedel

+0

Guter Anruf. Ich erinnere mich, dass das Lesen von MD5 vor ein paar Jahren als verwundbar galt. Geeze, das aus Wikipedia: "Am 18. März 2006 veröffentlichte Klima einen Algorithmus [10], der innerhalb einer Minute auf einem einzelnen Notebook eine Kollision mit einer Methode, die er Tunneling nennt, findet." – core

Antwort

3

Wenn Sie mit Reflector suchen, ruft die Clear-Methode HashAlgorithm einfach die private Methode Dispose auf. Der Grund für die Offenlegung einer Methode mit dem Namen Clear war wahrscheinlich nur, dass die Entwickler der Klasse dachten, dass es ein geeigneterer Name für einen Hash-Algorithmus wäre. Sie sehen ähnliche Stile in anderen Teilen der BCL, z. B. Close für System.IO.Stream. Die beste Vorgehensweise besteht darin, einen using Block zu verwenden, der automatisch die private Methode Dispose aufruft, wenn sie fertig ist.

+0

Wie von anderen erwähnt, ist es am besten, einen 'using' Block zu verwenden, der die try-finally/dispose Logik für Sie vereinfacht und empfohlen wird. – Noldorin

-4

Sie sollten den GC das für Sie behandeln lassen. Das ist seine Aufgabe.

Einige Ressourcen sollten entsorgt werden, wie DB-Verbindungen und Dateihandles, also setzen Sie diese in einen using Block (C#). Dies ist jedoch keiner dieser Fälle.

+0

Eigentlich implementieren HashAlgorithm (und damit MD5CryptoServiceProvider) * IDisposable, daher sollten sie ordnungsgemäß entsorgt werden, entweder durch Aufruf der Clear-Methode oder mit einem 'using'-Block. – Noldorin

+3

Nur weil die Klasse IDisposable implementiert, bedeutet das nicht, dass sie manuell entsorgt werden muss. Jedem jedoch sein eigenes. –

+0

Nein, aber die Tatsache, dass es IDisposable * immer implementiert, bedeutet fast immer, dass es manuell entsorgt werden sollte, da es eine native Interop-Funktion ausführt. Der GC wird schließlich dazu übergehen, es zu entsorgen, auch wenn Sie die Methode nicht explizit aufrufen, aber die Zeit, zu der dies eintritt, ist nicht garantiert bald – Noldorin

10

Während die Methode Dipose() privat ist, können Sie, wenn Sie sie auf IDisposable umwandeln, darauf zugreifen. Wie andere schon gesagt haben, Clear() wird es für Sie anrufen.

Ein besserer Ansatz ist jedoch die Erklärung und und Zuordnung der Variablen in einer using() Block einzuschließen:

byte[] hashCode; 

using(var hasher = new MD5CryptoServiceProvider()) 
{ 
    hashCode = hasher.ComputeHash(data); 
} 
Verwandte Themen