В предположении, что дисковый ввод-вывод и свободная оперативная память являются узким местом (хотя процессорное время не является ограничением), существует ли инструмент, который может рассчитывать несколько дайджестов сообщений одновременно?
Меня особенно интересует вычисление дайджестов больших файлов MD-5 и SHA-256 (размер в гигабайтах), предпочтительно параллельно. Я пытался openssl dgst -sha256 -md5
, но он вычисляет только хэш, используя один алгоритм.
Псевдокод для ожидаемого поведения:
for each block:
for each algorithm:
hash_state[algorithm].update(block)
for each algorithm:
print algorithm, hash_state[algorithm].final_hash()
shell-script
hashsum
parallelism
Lekensteyn
источник
источник
for i in file1 file2 …; do sha256 "$i"& md5sum "$i"; done
for i in file1 file2 …; do tee < "$i" >(sha256sum) | md5sum ; done
Затем вам нужно добавить дополнительный код, чтобы пометить имя файла, потому что оно отправляется как стандартный ввод вmd5sum
иsha256sum
.Ответы:
Проверить
pee
("tee standard input to pipes
") изmoreutils
. Это в основном эквивалентноtee
команде Марко , но немного проще для ввода.источник
pee
имеет лучший интерфейс, сравнение времени с другими инструментами можно найти в этом посте, который также демонстрирует многопоточный инструмент Python.moreutils
конфликтует сGNU parallel
моей системой Debian ... хотя, приятно знать, что есть такой инструмент.aptitude
Не позволяет мне иметь оба пакета одновременно).moreutils-parallel
имя, чтобы избежать конфликта.Вы можете использовать
for
цикл для зацикливания отдельных файлов, а затем использовать вtee
сочетании с подстановкой процессов (работает в Bash и Zsh среди других) для передачи к различным контрольным суммам.Пример:
Вы также можете использовать более двух контрольных сумм:
Это имеет тот недостаток, что контрольные суммы не знают имя файла, потому что оно передается как стандартный ввод. Если это неприемлемо, вы должны указать имена файлов вручную. Полный пример:
источник
*sum
семейством инструментов, вместо этого можно использовать это выражение sed:sed "s;-\$;${file//;/\\;};
(замените конечный символ-
именем файла, но убедитесь, что имя файла правильно экранировано).zsh
. В ksh93 и bash вывод sha256sum идет в md5sum. Вы хотите:{ tee < "$file" >(sha256sum >&3) | md5sum; } 3>&1
. Обратитесь к unix.stackexchange.com/q/153896/22565 для решения обратной проблемы.Жаль, что утилита openssl не принимает несколько команд дайджеста; Я предполагаю, что выполнение одной и той же команды для нескольких файлов - более распространенный способ использования. FWIW, версия утилиты openssl в моей системе (Mepis 11) имеет только команды для sha и sha1, но не какие-либо другие варианты sha. Но у меня есть программа sha256sum, а также md5sum.
Вот простая программа на Python, dual_hash.py, которая делает то, что вы хотите. Размер блока в 64 Кб, по-видимому, является оптимальным для моей машины (Intel Pentium 4 2,00 ГГц с 2 ГБ оперативной памяти), YMMV. Для небольших файлов его скорость примерно такая же, как при последовательном запуске md5sum и sha256sum. Но для больших файлов это значительно быстрее. Например, для файла размером 1967063040 байт (образ диска с SD-картой, полной файлов mp3), md5sum + sha256sum занимает около 1m44,9 с, dual_hash.py занимает 1 м 0,332 с.
dual_hash.py
Я полагаю , версия С / С ++ этой программы будет немного быстрее, но не так много, так как большая часть работы делается модулем hashlib, который будет написан на C (или C ++). И, как вы заметили выше, узким местом для больших файлов является скорость ввода-вывода.
источник
md5sum
и вsha256sum
сочетании (4.7s + 14.2s против 18.7s для этого Python скрипта, файл в кэше, 33.6s для холодного запуска). 64 КБ против 1 МБ не изменили ситуацию. С прокомментированным кодом 5,1 с было потрачено на md5 (n = 3), 14,6 с на sha1 (n = 3). Протестировано на i5-460M с 8 ГБ оперативной памяти. Я думаю, что это может быть улучшено за счет использования большего количества потоков.digests
обрабатывает только один файл при каждом вызове. Таким образом, даже если вы вызывали его в цикле, он будет создавать новые контексты md5 & sha при каждом вызове. FWIW, вам может понравиться мой возобновляемый хэш SHA-256 .Вы всегда можете использовать что-то вроде параллельной GNU :
В качестве альтернативы, просто запустите один из двух в фоновом режиме:
Или сохраните вывод в разные файлы и запустите несколько заданий в фоновом режиме:
Это запустит столько
md5sum
иsha256sum
экземпляров , как у вас есть файлы , и все они будут работать параллельно, сохраняя их выход на соответствующие имена файлов. Осторожно, это может стать тяжелым, если у вас много файлов.источник
Из любопытства , будет ли многопоточный сценарий Python сократить время работы, я создал этот
digest.py
скрипт , который используетthreading.Thread
,threading.Queue
иhashlib
для вычисления хэш для нескольких файлов.Многопоточная реализация Python действительно немного быстрее, чем при использовании
pee
с coreutils. Ява с другой стороны это ... ме. Результаты доступны в этом сообщении фиксации :Вывод хеша совместим с выводом coreutils. Поскольку длина зависит от алгоритма хеширования, этот инструмент не печатает его. Использование (для сравнения
pee
также было добавлено):источник
pee "openssl sha256" "openssl md5" < file
, но, честно говоря, я просто попробовал, и он не побил digest.py. Это сократило разрыв, хотя.Jacksum - это бесплатная и независимая от платформы утилита для вычисления и проверки контрольных сумм, CRC и хешей (дайджестов сообщений), а также временных меток файлов. (взято из справочной страницы jacksum )
Он поддерживает большие файлы, он может обрабатывать файлы размером до 8 эксабайт (= 8 000 000 000 гигабайт), что предполагает вашу операционную систему, соответственно, ваша файловая система также поддерживает большие файлы. (взято из http://www.jonelo.de/java/jacksum/ )
Пример использования:
Образец вывода:
В Ubuntu запустите команду,
apt-get install jacksum
чтобы получить его.Кроме того, исходные коды доступны на
источник