Я хочу вычислить контрольную сумму MD5 и SHA для ряда огромных файлов.
Каждый файл о 1GB
Поэтому я хочу быть как можно быстрее.
Может ли кто-нибудь помочь порекомендовать эффективную библиотеку C ++?
КСТАТИ,
При чтении файла fread( buffer, sizeof(char), BUFFER_SIZE, fin )
какого размера BUFFER_SIZE
разумно?
Я бы лично сделал FILE *pipe = popen("md5sum filename");
[или что-то в этом роде] — скорее всего, это будет так же быстро, как и все остальное, поскольку чтение 1 ГБ файла займет некоторое время, а вычисления вряд ли будут использовать большую часть вашего процессорного времени — большую часть времени будет ждать, пока диск загрузит файл.
В моей системе я создал 6 файлов по 1 ГБ каждый, и проверка контрольной суммы файла с помощью md5sum занимает 2 секунды. (12 секунд для всех 6 файлов).
Вы можете использовать Openssl.
Поиск мистического ответа о большом файле MD5
Как создать md5 хэш строки в C?
Посмотрев документы Openssl SHA, вы увидите, что способы использования этих функций в MD5 и SHA одинаковы.
SHA Openssl Docs
Кроме того, я не знаю никакой быстрой библиотеки C ++. Вычисление хеша относительно просто, поэтому любую библиотеку C будет так же легко использовать (вы можете легко обернуть ее в класс C ++ самостоятельно). Я нашел следующий сайт, где парень реализовал несколько алгоритмов хеширования в сборке x86 и сравнил их с «официальными» реализациями C тех же алгоритмов:
https://www.nayuki.io/page/fast-sha1-hash-implementation-in-x86-assembly
https://www.nayuki.io/page/fast-md5-hash-implementation-in-x86-assembly
Эти реализации должны быть хорошей отправной точкой, и тогда вам нужно просто сделать файловый ввод-вывод максимально эффективным. Операции ввода-вывода с отображением в память, как правило, очень эффективны, или тогда вы можете пойти сложнее и использовать два потока: один поток читает фрагменты из файла, а другой поток хэширует прочитанные данные. Идея здесь состоит в том, чтобы всегда сохранять процесс, выполняющий что-то полезное, то есть хэши могут быть вычислены, ожидая, пока больше данных будет считано из файла.