Я имею в виду аналогичную вещь, как в PHP sha1_file
,
Я нашел очень хороший и компактный скрипт, который не нуждается во внешних библиотеках, таких как boost: http://code.google.com/p/smallsha1/source/browse/trunk/sha1.cpp
Но есть ли способ передать ему файловый поток, если размер файла составляет, например, 10 ГБ?
Точный код не может принять поток, нет.
Посмотри на петлю while (currentBlock <= endOfFullBlocks)
, Он выполняет 64 байта за раз через реальный хеширующий код. Таким образом, чтобы изменить этот код для получения потока, вам нужно прочитать эти 64 байта из потока, а не брать их из sarray
(который указывает на те же данные, что и вход src
).
64 байта на чтение не эффективный способ чтения 10 ГБ данных, поэтому на самом деле вы можете ввести второй цикл: один для чтения больших кусков из файла и один для помещения 64-байтовых блоков этого через хеш.
Вам, конечно, также нужно изменить код, чтобы он обрабатывал «оставшуюся» часть входных данных, которая не кратна 64.
В качестве альтернативы найдите другую реализацию SHA1 с функциями «init», «update», «finish» / «digest» и используйте ее вместо этого. Идея таких интерфейсов состоит в том, что вы вызываете «update» столько раз, сколько хотите, передавая порции данных любого размера, удобного для чтения вашего потока.
Для больших файлов вы можете отобразить часть файла в памяти, рассчитать сумму, переназначить следующую часть файла и продолжить суммирование и т. Д.