2009-04-17 1 views
5

MD5CryptoServiceProvider와 같은 HashAlgorithm에서 파생 된 개체에는 Dispose() 메서드가 있지만 개인 개체입니다. 대신 Clear() 메소드를 사용합니다.이 메소드는 "모든 자원 해제"메소드를 사용합니다..NET : HashAlgorithm 개체 처분

WTF?

다음은 HashAlgorithm을 올바르게 처리하는 방법입니다.

var hasher = new MD5CryptoServiceProvider(); 

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

hasher.Clear(); 

누군가가 나에게 설명하고 싶습니까? :)

+0

난 당신이 많은이를 간주 할 수 있다면 당신은 너무 다른 해싱 알고리즘을 사용하는 것이 좋습니다 :

더 좋은 방법은, 그러나, 사용() 블록에서 변수의 선언과 할당을 둘러싸이다 특정 응용 프로그램에서는 MD5 해시가 안전하지 않습니다. SHA 256과 같은 SHA 계열이 좋은 대안이 될 수 있습니다. 이들은 .NET에서도 사용할 수 있습니다. – Skurmedel

+0

전화하세요. 나는 MD5가 몇 년 전부터 취약한 것으로 판명되었다는 것을 기억합니다. Geeze, Wikipedia의 "2006 년 3 월 18 일, Klima는 터널링이라고하는 방법을 사용하여 단일 노트북 컴퓨터에서 1 분 내에 충돌을 찾을 수있는 알고리즘 [10]을 발표했습니다. – core

답변

3

반사경을보고 HashAlgorithmClear 방법은 단순히 개인 Dispose 메서드를 호출합니다. 이름이 Clear 인 메소드를 노출 한 이유는 아마도 클래스 설계자가 해시 알고리즘에 더 적합한 이름이라고 생각했기 때문일 것입니다. System.IO.Stream의 경우 과 같이 BCL의 다른 부분에서 비슷한 스타일을 볼 수 있습니다. 또한 여기에서 using 블록을 사용하는 것이 가장 좋습니다.이 블록은 완료되면 자동으로 Dispose 개인 메소드를 호출합니다.

+0

다른 사람들에 의해 언급 되었 듯이, 어쨌든 try-finally/dispose 로직을 단순화하고 권장되는 방법 인'using' 블록을 사용하는 것이 가장 좋다. – Noldorin

-4

GC에서 처리하도록해야합니다. 그게 일이야.

일부 리소스는 DB 연결 및 파일 핸들처럼 처리해야하므로 using 블록 (C#)에 저장해야합니다. 하지만 그 중 하나가 아닙니다.

+0

실제로 HashAlgorithm (따라서 MD5CryptoServiceProvider) * IDisposable을 구현하므로 Clear 메서드를 호출하거나'using' 블록을 사용하여 적절히 처리해야합니다. – Noldorin

+3

클래스가 IDisposable을 구현하기 때문에 그것은 수동으로 처리해야한다는 의미는 아닙니다. 각자 자신에게. –

+0

실제로 IDisposable을 구현한다는 것은 거의 항상 내부에서 내부 interop을 수행하기 때문에 수동으로 처리해야한다는 것을 강하게 의미합니다. GC는 메소드를 명시 적으로 호출하지 않아도 결국 폐기됩니다. 그러나이 시간은 곧 보장되지 않습니다. – Noldorin

10

Dipose() 방법이 비공개인데, IDisposable으로 전송하면 액세스 할 수 있습니다. 다른 사람들이 말했듯이, Clear()이 당신을 위해 전화 할 것입니다.

byte[] hashCode; 

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