iTextSharp 를 사용하여 PDF 파일에서 텍스트를 읽습니다. 그러나 PDF 파일에는 이미지 만 포함되어 있기 때문에 텍스트를 추출 할 수없는 경우가 있습니다. 매일 동일한 PDF 파일을 다운로드하고 PDF가 수정되었는지 확인하고 싶습니다. 텍스트 및 수정 날짜를 얻을 수없는 경우 MD5 체크섬이 파일이 변경되었는지 확인하는 가장 신뢰할 수있는 방법입니까?
그렇다면 암호화에 대한 경험이 많지 않기 때문에 일부 코드 샘플이 좋습니다.
답변
System.Security.Cryptography.MD5 사용하면 매우 간단합니다 .
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return md5.ComputeHash(stream);
}
}
( 실제로 사용 된 MD5 구현은 폐기 할 필요는 없지만, 여전히 그렇게 할 것입니다.)
나중에 결과를 비교하는 방법은 귀하에게 달려 있습니다. 예를 들어 바이트 배열을 base64로 변환하거나 바이트를 직접 비교할 수 있습니다. (배열은 재정의하지 않습니다 Equals
. base64를 사용하는 것이 더 간단하지만 해시 비교에만 관심이 있다면 약간 덜 효율적입니다.)
해시를 문자열로 나타내야하는 경우 다음을 사용하여 해시를 16 진수로 변환 할 수 있습니다 BitConverter
.
static string CalculateMD5(string filename)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
var hash = md5.ComputeHash(stream);
return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant();
}
}
}
답변
이것이 내가하는 방법입니다.
using System.IO;
using System.Security.Cryptography;
public string checkMD5(string filename)
{
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(filename))
{
return Encoding.Default.GetString(md5.ComputeHash(stream));
}
}
}
답변
나는이 질문에 이미 답변되었지만 이것이 내가 사용하는 것입니다.
using (FileStream fStream = File.OpenRead(filename)) {
return GetHash<MD5>(fStream)
}
어디 GetHash :
public static String GetHash<T>(Stream stream) where T : HashAlgorithm {
StringBuilder sb = new StringBuilder();
MethodInfo create = typeof(T).GetMethod("Create", new Type[] {});
using (T crypt = (T) create.Invoke(null, null)) {
byte[] hashBytes = crypt.ComputeHash(stream);
foreach (byte bt in hashBytes) {
sb.Append(bt.ToString("x2"));
}
}
return sb.ToString();
}
아마도 가장 좋은 방법은 아니지만 유용 할 수 있습니다.
답변
여기 내가 찾은 약간 더 간단한 버전이 있습니다. 전체 파일을 한 번에 읽고 단일 using
지시문 만 필요합니다 .
byte[] ComputeHash(string filePath)
{
using (var md5 = MD5.Create())
{
return md5.ComputeHash(File.ReadAllBytes(filePath));
}
}
답변
나는 파티에 늦었지만 실제로 솔루션을 구현하기 전에 테스트를 수행했다는 것을 알고 있습니다.
내장 MD5 클래스와 md5sum.exe 에 대한 테스트를 수행 했습니다 . 필자의 경우 내장 클래스는 md5sum.exe가 매 실행마다 16-18 초 정도 걸리는 13 초가 걸렸습니다.
DateTime current = DateTime.Now;
string file = @"C:\text.iso";//It's 2.5 Gb file
string output;
using (var md5 = MD5.Create())
{
using (var stream = File.OpenRead(file))
{
byte[] checksum = md5.ComputeHash(stream);
output = BitConverter.ToString(checksum).Replace("-", String.Empty).ToLower();
Console.WriteLine("Total seconds : " + (DateTime.Now - current).TotalSeconds.ToString() + " " + output);
}
}
답변
그리고 MD5를 계산하여 Azure Blob의 MD5와 일치하는지 확인해야하는 경우이 SO 질문과 답변이 도움이 될 수 있습니다. Azure에 업로드 된 BLOB의 MD5 해시가 로컬 컴퓨터의 동일한 파일과 일치하지 않습니다.
답변
