Intereting Posts
Aptitude не удаляет автоматически установленные пакеты Изменение размера раздела после изображения с помощью dd на другой диск Как я могу проверить наличие плохих блоков на физическом томе LVM? форматировать / переписать старый модуль ide flash Строка состояния i3: низкая батарея не отображается красным цветом Как сделать X менее чувствительным при щелчке правой кнопкой мыши? Программный RAID слишком мал Сделайте вывод bash! = 0, вызванный AWK и прерванный с помощью ^ C make reposync игнорировать /etc/yum.conf? Не работает соединение после запуска службы OpenVPN? команда: ls / etc | сортировать | grep d * не дает результатов, но ls / etc | сортировать | grep p * перечисляет всю директорию после включения Xinerama (в графической карте AMD с двумя головками) системная графика зависает Поиск пакетов с установленными старыми конфигурациями и принудительное использование новых конфигураций sudo askpass: спросить у другого tty автоматическое отключение RAID-массива

Одновременно вычислите несколько дайджестов (md5, sha256)?

В предположении, что дисковый ввод-вывод и свободная оперативная память являются узким местом (в то время как время процессора не является ограничением), существует ли средство, которое может вычислять сразу несколько дайджестов сообщений?

Мне особенно интересно рассчитать дайджесты 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() 

Проверьте peetee standard input to pipes ») от более moreutils . Это в основном эквивалентно команде tee Marco, но немного проще набирать.

 $ echo foo | pee md5sum sha256sum d3b07384d113edec49eaa6238ad5ff00 - b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c - 
 $ pee md5sum sha256sum <foo.iso f109ffd6612e36e0fc1597eda65e9cf0 - 469a38cb785f8d47a0f85f968feff0be1d6f9398e353496ff7aa9055725bc63e - 

Вы можете использовать цикл for для перебора отдельных файлов, а затем использовать tee сочетании с заменой процесса (работает в Bash и Zsh среди других) для подключения к различным контрольным суммам.

Пример:

 for file in *.mkv; do tee < "$file" >(sha256sum) | md5sum done 

Вы также можете использовать более двух контрольных сумм:

 for file in *.mkv; do tee < "$file" >(sha256sum) >(sha384sum) | md5sum done 

Это имеет тот недостаток, что контрольные суммы не знают имя файла, поскольку оно передается как стандартный ввод. Если это неприемлемо, вы должны вручную указать имена файлов. Полный пример:

 for file in *.mkv; do echo "$file" tee < "$file" >(sha256sum) >(sha384sum) | md5sum echo done > hashfilelist 

Вы всегда можете использовать нечто вроде GNU parallel :

 echo "/path/to/file" | parallel 'md5sum {} & sha256sum {}' 

Кроме того, просто запустите один из двух в фоновом режиме:

 md5sum /path/to/file & sha256sum /path/to/file 

Или сохраните вывод в разных файлах и запустите несколько заданий в фоновом режиме:

 for file in *; do md5sum "$file" > "$file".md5 & sha256sum "$file" > "$file".sha & done 

Это запустит столько экземпляров md5sum и sha256sum сколько у вас есть файлы, и все они будут выполняться параллельно, сохраняя их вывод в соответствующие имена файлов. Осторожно, но это может стать тяжелым, если у вас много файлов.

Жаль, что утилита 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.9s, dual_hash.py занимает 1m0.312s.

dual_hash.py

 #! /usr/bin/env python ''' Calculate MD5 and SHA-256 digests of a file simultaneously Written by PM 2Ring 2014.10.23 ''' import sys import hashlib def digests(fname, blocksize): md5 = hashlib.md5() sha = hashlib.sha256() with open(fname, 'rb') as f: while True: block = f.read(blocksize) if not block: break md5.update(block) sha.update(block) print("md5: %s" % md5.hexdigest()) print("sha256: %s" % sha.hexdigest()) def main(*argv): blocksize = 1<<16 # 64kB if len(argv) < 2: print("No filename given!\n") print("Calculate md5 and sha-256 message digests of a file.") print("Usage:\npython %s filename [blocksize]\n" % sys.argv[0]) print("Default blocksize=%d" % blocksize) return 1 fname = argv[1] if len(argv) > 2: blocksize = int(sys.argv[2]) print("Calculating MD5 and SHA-256 digests of %r using a blocksize of %d" % (fname, blocksize)) digests(fname, blocksize) if __name__ == '__main__': sys.exit(main(*sys.argv)) 

Я полагаю, что C / C ++ версия этой программы будет немного быстрее, но не очень, так как большая часть работы выполняется с помощью модуля hashlib, который написан на C (или C ++). И, как вы отметили выше, узким местом для больших файлов является скорость ввода-вывода.

Из любопытства, будет ли многопоточный скрипт Python сократить время выполнения, я создал этот скрипт digest.py который использует threading.Thread , threading.Queue и hashlib для вычисления хэшей для нескольких файлов.

Многопотоковая реализация Python действительно немного быстрее, чем использование pee with coreutils. С другой стороны, Java … meh. Результаты доступны в этом сообщении о фиксации :

Для сравнения, для файла размером 2,3 гигабайта (min / avg / max / sd secs для n = 10):

  • pee sha256sum md5sum <файл: 16.5 / 16.9 /17.4/.305
  • python3 digest.py -sha256 -md5 <файл: 13.7 / 15.0 /18.7/1.77
  • python2 digest.py -sha256 -md5 <файл: 13.7 / 15.9 /18.7/1.64
  • jacksum -a sha256 + md5 -F '#CHECKSUM {i} #FILENAME': 32.7 / 37.1 /50/6.91

Выход хеша совместим с выходом, производимым coreutils. Поскольку длина зависит от алгоритма хэширования, этот инструмент не печатает его. Использование (для сравнения также была добавлена pee ):

 $ ./digest.py -sha256 -md5 digest.py c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 digest.py b575edf6387888a68c93bf89291f611c digest.py $ ./digest.py -sha256 -md5 <digest.py c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 - b575edf6387888a68c93bf89291f611c - $ pee sha256sum md5sum <digest.py c217e5aa3c3f9cfaca0d40b1060f6233297a3a0d2728dd19f1de3b28454975f2 - b575edf6387888a68c93bf89291f611c - 

Jacksum – бесплатная и независимая от платформы утилита для вычисления и проверки контрольных сумм, CRC и хэшей (дайджестов сообщений), а также временных файлов. (выдержка из страницы mans jacksum )

Это большой файл, он может обрабатывать файлы объемом до 8 эксабайт (= 8 000 000 000 гигабайт), предположительно, ваша операционная система, соответственно, ваша файловая система также является большой файловой системой. (выдержки из http://www.jonelo.de/java/jacksum/ )

Пример использования:

 jacksum -a md5+sha256 -F "#ALGONAME{i} (#FILENAME) = #CHECKSUM{i}" jacksum-testfile 

Пример вывода:

 md5 (jacksum-testfile) = d41d8cd98f00b204e9800998ecf8427e sha256 (jacksum-testfile) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 

На ubuntu запустите команду apt-get install jacksum чтобы получить ее.

В качестве альтернативы исходные коды доступны на