선택한 파일에 대해 MD5, MD4, SHA1, SHA256, SHA512, RIPEMD160 등의 계산을하고 있습니다. 다음 알고리즘을 만들었지 만 문제가 있습니다.C#에서 해시 계산
string finalHash;
byte[] buffer;
byte[] oldBuffer;
int bytesRead;
int oldBytesRead;
long streamSize;
long totalBytesRead = 0;
try
{
if (!String.IsNullOrEmpty(selectedFile))
{
_dataStream = File.OpenRead(selectedFile);
selectedFile = string.Empty;
}
foreach (var hashObject in from Control ctrl in Controls where ctrl is CheckBox && ((CheckBox)ctrl).Checked select HashObject)
{
//totalBytesRead = 0;
streamSize = _dataStream.Length;
buffer = new byte[4096];
bytesRead = _dataStream.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
do
{
oldBytesRead = bytesRead;
oldBuffer = buffer;
buffer = new byte[4096];
bytesRead = _dataStream.Read(buffer, 0, buffer.Length);
totalBytesRead += bytesRead;
if (bytesRead == 0)
{
hashObject.TransformFinalBlock(oldBuffer, 0, oldBytesRead);
}
else
{
hashObject.TransformBlock(oldBuffer, 0, oldBytesRead, oldBuffer, 0);
}
hashCalculationWorker.ReportProgress((int)((double)totalBytesRead * 100/streamSize));
} while (bytesRead != 0);
e.Result = hashObject.Hash;
finalHash = GenerateHex(hashObject.Hash);
Invoke(new MethodInvoker(() =>
{
// Get finalHash
}));
hashObject.Dispose();
}
}
catch (Exception)
{
}
private HashAlgorithm HashObject
{
get
{
if (isMD5Selected)
{
_hashObject = MD5.Create();
isMD5Selected = false;
}
else if (isMD4Selected)
{
_hashObject = MD4.Create();
isMD4Selected = false;
}
else if (isSHA1Selected)
{
_hashObject = SHA1.Create();
isSHA1Selected = false;
}
...
return _hashObject;
}
}
위의 코드에서 foreach 문은 선택한 해시 알고리즘의 수에 따라 다릅니다. 첫 번째 선택된 해시를 올바르게 계산하지만 두 번째 및 다음 반복마다 다른 값을 제공합니다. 뭐가 잘못 됐어. 아무도 나를 도울 수 있습니까? 미리 감사드립니다.
처음에는'_dataStream'을 재설정하지 않았습니다 ... –
내 머리 꼭대기에서 변수와 데이터 스트림을 올바르게 재설정하지 않았습니다. – KingCronus
@KingCronus 각 반복마다 _dataStream을 가져와야합니까? –