2014-01-18 4 views
0
다음 방법으로 C#에서 파일의 MD5 해시를 계산하는 방법

:MD5 해시는

Compute hash for range 1-4096 bytes -> get MD5 hash for this range; 
1-8192 -> get MD5 hash for this range; 
1-12288 -> get MD5 hash for this range; 
1-16384 -> get MD5 hash for this range; 
... 
1-end of file -> get MD5 hash for file. 

그래서 난 항상 크기가 4096 바이트 버퍼를 사용하여 파일을 읽고 모든 해시를 업데이트 할이 부분을 읽어 파일. 그것을 실현하는 방법? MD5CryptoServiceProvider 같은 작업을 수행 할 수 없습니다.

+1

왜 이렇게하고 싶은지 확실하지 않습니다. 왜 전체 파일을 해시하지 않는 것이 좋을까요? 왜 각 부분에 해시가 필요합니까? –

+0

이 링크를 시도하십시오. http://stackoverflow.com/questions/827527/c-sharp-md5-hasher-example – Mzf

+0

콘텐츠별로 많은 수의 파일을 비교하고이 파일을 부분적으로 읽으려면 비교할 좋은 방법입니다. 마지막으로 읽은 부분의 체크섬은 내가 필요로하는 것이 아니며 모든 읽기 파일 부분의 체크섬을 가져오고 싶습니다. –

답변

1

일반적으로 MD5 및 기타 해시는 이와 같이 작동하지 않습니다. 마지막 블록에서 특정 패딩을 사용합니다. 따라서 일부 바이트의 최종 해시를 계산하면 나중에 더 많은 바이트를 추가 할 수 없습니다. 마지막 블록을 추가하고 해시를 계산하면 게임이 끝났으므로 다시 시작해야합니다.

해시를 계산하고 싶지만 앞으로 나아갈 것으로 알고 있습니다.

최상의 전략은 상태를 복제 할 수있는 사용자 지정 MD5 구현을 사용하는 것입니다. 하나의 블록을 추가 할 때 MD5 알고리즘의 상태를 복제하면 MD5 hasher와 동일한 상태를 유지해야합니다. 복제본 중 하나를 사용하여 변환을 완료합니다. 다른 것을 사용하면 더 나아갈 수 있습니다. 의사 코드 :

hasher = new md5 
loop 
    read a block of the file 
    hasher.addblock(current block) 
    hasher2 = hasher.clone() 
    hasher.finish() 
    hasher = hasher2 
end loop 
+0

예, 필요한 것입니다. 해시 객체의 상태를 복사합니다. 그러나 이것을 수행 할 방법이 없습니다. 이 답변에서 코드를 시도 : http://stackoverflow.com/a/11308879/2183994하지만 작동하지 않습니다. –

+0

MD5CryptoServiceProvider는 관리되지 않는 API (기본 Windows CSP)를 사용하므로 .NET에서 복제 할 수 없습니다. 순수한 .NET MD5 구현이 필요하며 쉽게 찾을 수 있어야합니다. 이전 .NET 프레임 워크에서 MD5Managed 클래스가 있었을 수도 있습니다. 정확히 기억하지는 못하지만, 그래도 이름이 같은 클래스를 찾을 수는 있습니다. 여기 : http://archive.msdn.microsoft.com/SilverlightMD5/Wiki/View.aspx?title=MD5Managed – fejesjoco

+0

조언 해 주셔서 감사합니다! MD5Managed는 좋은 솔루션입니다. –