Я пытаюсь разработать простое приложение, которое будет использоваться для вычисления CRC32/md5/sha1/sha256/sha384/sha512 файла, и я столкнулся с небольшим препятствием.. Это делается в C #.
Я хотел бы сделать это как можно эффективнее, поэтому моей первоначальной мыслью было сначала прочитать файл в поток памяти перед обработкой, но вскоре я обнаружил, что очень большие файлы приводят к тому, что мне очень не хватает памяти. быстро. Так что может показаться, что вместо этого я должен использовать файловый поток. Проблема, как мне кажется, заключается в том, что одновременно может выполняться только одна хэш-функция, и выполнение этого с файловым потоком займет некоторое время для завершения каждого хэша.
Как я могу прочитать небольшой фрагмент файла в память, обработать его всеми 6 алгоритмами, а затем перейти к другому фрагменту... Или хэширование не работает таким образом?
Это была моя первоначальная попытка чтения файла в память. Это не удалось, когда я попытался прочитать образ компакт-диска в память до запуска алгоритмов хеширования в потоке памяти:
private void ReadToEndOfFile(string filename)
{
if (File.Exists(filename))
{
FileInfo fi = new FileInfo(filename);
FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
byte[] buffer = new byte[16 * 1024];
//double step = Math.Floor((double)fi.Length / (double)100);
this.toolStripStatusLabel1.Text = "Reading File...";
this.toolStripProgressBar1.Maximum = (int)(fs.Length / buffer.Length);
this.toolStripProgressBar1.Value = 0;
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
this.toolStripProgressBar1.Value += 1;
}
_ms = ms;
}
}
}