Как создать контрольную сумму md5 или sha1 файла без загрузки его содержимого в память?

Я имею в виду аналогичную вещь, как в PHP sha1_file,

Я нашел очень хороший и компактный скрипт, который не нуждается во внешних библиотеках, таких как boost: http://code.google.com/p/smallsha1/source/browse/trunk/sha1.cpp

Но есть ли способ передать ему файловый поток, если размер файла составляет, например, 10 ГБ?

2

Решение

Точный код не может принять поток, нет.

Посмотри на петлю while (currentBlock <= endOfFullBlocks), Он выполняет 64 байта за раз через реальный хеширующий код. Таким образом, чтобы изменить этот код для получения потока, вам нужно прочитать эти 64 байта из потока, а не брать их из sarray (который указывает на те же данные, что и вход src).

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

Вам, конечно, также нужно изменить код, чтобы он обрабатывал «оставшуюся» часть входных данных, которая не кратна 64.

В качестве альтернативы найдите другую реализацию SHA1 с функциями «init», «update», «finish» / «digest» и используйте ее вместо этого. Идея таких интерфейсов состоит в том, что вы вызываете «update» столько раз, сколько хотите, передавая порции данных любого размера, удобного для чтения вашего потока.

5

Другие решения

Для больших файлов вы можете отобразить часть файла в памяти, рассчитать сумму, переназначить следующую часть файла и продолжить суммирование и т. Д.

0