MD5 Checksum 질문

1개의 νŒŒμΌμ„ 읽을 λ•ŒλŠ” λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€.
λ‹€λ§Œ 2개 이상 λΆ€ν„° λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ‚˜λŠ”κ±° κ°™μŠ΅λ‹ˆλ‹€.

해결법이 μžˆμ„κΉŒμš”?

μ–΄λ–»κ²Œ μ½”λ“œλ₯Ό κ΅¬ν˜„ν•˜μ…¨λŠ”μ§€ λ§μ”€ν•΄μ£Όμ‹œμ§€ μ•ŠμœΌλ©΄ 좔츑에 μ˜κ±°ν•΄μ„œ 닡을 ν•΄λ“œλ¦¬κ±°λ‚˜ λŒ€μ‹  μ½”λ”©ν•΄λ“œλ €μ•Ό ν•˜λŠ” 상황이 λ©λ‹ˆλ‹€.

1개의 μ’‹μ•„μš”
*OpenFileDialog ofd = new OpenFileDialog();
String filePath = "text.txt";

byte[] btAscii = File.ReadAllBytes(filePath);
byte[] btHash = MD5.Create().ComputeHash(btAscii);
label5.Text = BitConverter.ToString(btHash).Replace("-", "").ToLower();

이런 μ‹μœΌλ‘œ ν–ˆμŠ΅λ‹ˆλ‹€

1개의 μ’‹μ•„μš”

λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ‚œλ‹€λŠ”κ²Œ μ–΄λ–€ 근거둜 λ‚œλ‹€λŠ”κ±΄μ§€ μ•Œμˆ˜μžˆμ„κΉŒμš”??
μ•„λž˜ μ½”λ“œλ‘œ n번 λ°˜λ³΅ν•΄λ³΄μ•˜μ§€λ§Œ λˆ„μˆ˜λ˜λŠ”λΆ€λΆ„μ„ μ°Ύμ„μˆ˜κ°€ μ—†μ–΄μ„œ κ·Έλ ‡μŠ΅λ‹ˆλ‹€β€¦

1개의 μ’‹μ•„μš”

foreachλ₯Ό μ‚¬μš©ν•˜μ—¬ text1.txt~text5.txt ν–ˆμ„ λ•Œ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ‚©λ‹ˆλ‹€

1개의 μ’‹μ•„μš”

λ‹¨μˆœνžˆ μ½”λ“œλ§Œ 봀을 λ•ŒλŠ” OpenFileDialog λ§κ³ λŠ” μ§šμ΄λŠ”κ²Œ μ—†μ–΄ λ³΄μž…λ‹ˆλ‹€.

이 클래슀λ₯Ό μ‚¬μš©ν•˜μ…¨λ‹€λ©΄ μ–˜λŠ” IDisposable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— Dispose() ν•¨μˆ˜ 호좜이 ν•„μš”ν•©λ‹ˆλ‹€.

2개의 μ’‹μ•„μš”

λ©”λͺ¨λ¦¬ λˆ„μˆ˜λΌκΈ° 보닀, 파일의 λͺ¨λ“  λ‚΄μš©μ„ λ©”λͺ¨λ¦¬μ— λΆˆλŸ¬μ˜€λŠ” λ™μž‘μ΄ μš°μ„  λ¬Έμ œκ°€ λ©λ‹ˆλ‹€.

byte[] btAscii = File.ReadAllBytes(filePath);

μ΄λ ‡κ²Œ ν•˜λ©΄, 예λ₯Ό λ“€μ–΄ 10MiB μ •λ„μ˜ νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λͺ¨λ‘ 읽어 λ“€μ΄λ―€λ‘œ 일단 10MiB λ‚΄μ™Έλ‘œ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•˜κΈ° μ‹œμž‘ν• κ²λ‹ˆλ‹€.

κ·Έ λ‹€μŒ,

btHash = MD5.Create().ComputeHash(btAscii);

이 μ½”λ“œμ—μ„œ μΆ”κ°€λ‘œ MD5 ν•΄μ‹± 연산을 μœ„ν•΄ μΆ”κ°€ λ©”λͺ¨λ¦¬ 곡간을 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€. btAscii 자체의 크기가 크닀면 λ‹Ήμ—°νžˆ μΆ”κ°€ λ©”λͺ¨λ¦¬ 곡간이 ν•„μš”ν•  κ²ƒμž…λ‹ˆλ‹€.

이 μ½”λ“œμ—μ„œ λ¬Έμžμ—΄ μ €μž₯을 μœ„ν•΄ μΆ”κ°€ λ©”λͺ¨λ¦¬λ₯Ό μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

λ‹Ήμ—°νžˆ μœ„μ˜ μ½”λ“œκ°€ μ—¬λŸ¬λ²ˆ λ°˜λ³΅ν•΄μ„œ μ‹€ν–‰λœλ‹€λ©΄ λ©”λͺ¨λ¦¬λ₯Ό 많이 μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€.

닷넷이 κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ„ μ§€μ›ν•˜λŠ” λŸ°νƒ€μž„ ν™˜κ²½μΈ 것은 λ§žμœΌλ‚˜, κ°€λΉ„μ§€ μ»¬λ ‰μ…˜μ΄ 아무 λ•Œλ‚˜ 돌면 제 μ„±λŠ₯을 λ‚Ό μˆ˜λŠ” μ—†κ³ , 일정 선을 λ„˜κΈ° μ „κΉŒμ§€λŠ” λ©”λͺ¨λ¦¬λ₯Ό ꡳ이 νšŒμˆ˜ν•˜λ €κ³  ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 마치 λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ μžˆλŠ” κ²ƒμ²˜λŸΌ 보일 수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ κΈ‰μ¦ν•˜λŠ” 것이 문제라고 μƒκ°ν•œλ‹€λ©΄, μœ„μ™€ 같이 λ‚˜μ΄λΈŒν•œ μ½”λ”© 방식 λŒ€μ‹  System.IO.Stream 등을 ν™œμš©ν•΄μ„œ μ‘°κΈˆμ”© 데이터λ₯Ό μ½λŠ” λ°©λ²•μœΌλ‘œ μ½”λ“œλ₯Ό κ³ μΉ˜κ±°λ‚˜, λ„ˆλ¬΄ 크기가 큰 νŒŒμΌμ€ μ·¨κΈ‰ν•˜μ§€ μ•Šλ„λ‘ 쑰건문을 달아 λ‘μ‹œλŠ”κ²Œ ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€λ©΄, λ‹€μŒκ³Ό 같이 고쳐쓸 수 μžˆμ„ κ²ƒμž…λ‹ˆλ‹€.

OpenFileDialog ofd = new OpenFileDialog();
String filePath = "text.txt";

using (var fileStream = File.OpenRead(filePath))
using (var hash = MD5.Create())
{
	byte[] btHash = hash.ComputeHash(fileStream);
	label5.Text = BitConverter.ToString(btHash).Replace("-", string.Empty).ToLowerInvariant();
}

덧) .NET 6 κΈ°μ€€μœΌλ‘œλŠ” ComputeHash의 async 버전인 ComputeHashAsync도 μžˆμŠ΅λ‹ˆλ‹€.

μ°Έκ³ : md5 - Computing MD5SUM of large files in C# - Stack Overflow

3개의 μ’‹μ•„μš”

λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€ λ§Žμ€ 도움이 λ˜μ—ˆμŠ΅λ‹ˆλ‹€!

2개의 μ’‹μ•„μš”