Возможный вычислить MD5 (или другой) хешируют с буферизированными чтениями?

Я должен вычислить контрольные суммы довольно больших файлов (гигабайты). Это может быть выполнено с помощью следующего метода:

    private byte[] calcHash(string file)
    {
        System.Security.Cryptography.HashAlgorithm ha = System.Security.Cryptography.MD5.Create();
        FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
        byte[] hash = ha.ComputeHash(fs);
        fs.Close();
        return hash;
    }

Однако файлы обычно пишутся просто заранее буферизированным способом (скажите что запись 32 МБ за один раз). Я так убежден, что видел переопределение хеш-функции, которая позволила мне вычислять MD5 (или другой) хеш в то же время, что и запись, т.е.: вычисление хеша одного буфера, затем подавая тот получающийся хеш в следующее повторение.

Что-то вроде этого: (выход псевдокода)

byte [] hash = new byte [] { 0,0,0,0,0,0,0,0 };
while(!eof)
{
   buffer = readFromSourceFile();
   writefile(buffer);
   hash = calchash(buffer, hash);
}

хеш теперь sililar к тому, что было бы выполнено путем выполнения функции calcHash на всем файле.

Теперь, я не могу найти переопределения как этот в. Сетевые 3.5 Платформы, я мечтаю? Это никогда не существовало, или я просто паршив при поиске? Причина того, чтобы сделать и писать и вычисление контрольной суммы сразу состоит в том, потому что это имеет смысл из-за больших файлов.

34
задан sindre j 23 January 2010 в 19:51
поделиться

3 ответа

Для обработки данных в кусочках используются методы TransformBlock и TransformFinalBlock.

// Init
MD5 md5 = MD5.Create();
int offset = 0;

// For each block:
offset += md5.TransformBlock(block, 0, block.Length, block, 0);

// For last block:
md5.TransformFinalBlock(block, 0, block.Length);

// Get the has code
byte[] hash = md5.Hash;

Примечание: Для завершения процесса (по крайней мере, с MD5-провайдером) все блоки отправляются на TransformBlock, а затем на TransformFinalBlock пустой блок.

46
ответ дан 27 November 2019 в 16:06
поделиться

Кажется, что вы можете использовать Transformblock / TransformFinalBlock , как показано в этом образце: Отображение обновлений прогресса при хешировании больших файлов

4
ответ дан 27 November 2019 в 16:06
поделиться

Ожидается, что хеш-алгоритмы будут справиться с этой ситуацией и обычно реализованы с 3 функциями:

Hash_init () - называется выделить ресурсы и начать хеш.
HASH_UPDATE () - называется новыми данными, поскольку он прибывает.
hash_final () - Заполните расчет и бесплатные ресурсы.

Посмотрите http://www.openssl.org/docs/crypto/md5.html или http://www.openssl.org/docs/crypto/sha.html Для хороших стандартных примеров в C; Я уверен, что для вашей платформы есть похожие библиотеки.

3
ответ дан 27 November 2019 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: