Как распараллелить команду sha256sum или другие команды хеширования?

Этот вопрос объединяет два отдельных классабайтовых единиц , а именно десятичныеG гигабайты и двоичныеGi бибайты:

   Prefixes for multiples of
   bits (bit) or bytes (B)
   Decimal              Binary
   Value        SI      Value       IEC
   1000   10^3  k kilo  1024   2^10 Ki kibi
   1000^2 10^6  M mega  1024^2 2^20 Mi mebi
   1000^3 10^9  G giga  1024^3 2^30 Gi gibi

Команда free -hпечатаетгибибайт, тогда как free -bпечатает байт . Выполняя математику, (сначала добавляйте суффикс 0к количеству байтов, чтобы компенсировать ошибку free, отмеченную в ответе Стивена Китта ):

echo $(( 16411549690 / (10**9) ))  # gigabytes
echo $(( 16411549690 / (2**30) ))  # gibibytes

Выходы:

16
15

Продавцы жестких дисков использовали эту распространенную путаницу, и один поставщик даже оказался в проигрыше в коллективном иске. См. Orin Safier против Western Digital Corporation , в котором недовольным покупателям в 2006 году было присуждено 30 долларов за программное обеспечение для резервного копирования, а не настоящие деньги, каждому за их проблемы.

2
16.05.2021, 17:42
3 ответа

Для распараллеливания файлов можно использовать GNU Parallel:

parallel sha256sum ::: *

Распараллеливание хеширования для одного файла можно выполнить с помощью определенных хеш-функций, использующих дерево Меркла. b3sumявляется таким инструментом.

2
28.07.2021, 11:33

В качестве альтернативы вы можете перейти на ЦП, который поддерживает аппаратные вычисления SHA256, такие как более новые ЦП Intel или AMD. Мой Ryzen 3700X невероятно быстро вычисляет хеш-суммы SHA256, намного быстрее, чем вычисление MD5, который является гораздо более простым алгоритмом. Проверьте sha_niв /proc/cpuinfo.

В качестве альтернативы вы можете использовать Blake3 , который намного (почти в 15 раз)быстрее , даже если реализован чисто программно:

enter image description here

1
28.07.2021, 11:33

xargs имеет опцию -Pдля параллельного запуска нескольких заданий. Она далеко не так гибка, как программа Оле Танге parallel, но подходит для большинства простых задач распараллеливания.

Например:

find. -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
  • -P 0указывает xargs запускать как можно больше заданий параллельно (например. на моем 32-поточном Threadripper 1950x он будет выполнять 32 opensslзаданий параллельно)

  • -n 1указывает xargs запускать каждое задание только с одним аргументом. В то время как 1 задание является под-оптимальным для openssl dgst, которое может обрабатывать много имен файлов в командной строке, вы почти всегда будете использовать опцию-n(или-Lxargs -P.

    В противном случае он попытается вписать в каждую командную строку как можно больше аргументов -, что обычно приводит к одному заданию, если только у вас не много десятков тысяч аргументов. В Linux ограничение длины командной строки обычно составляет 2 миллиона символов, 2097152 (проверьте с помощьюgetconf ARG_MAX). Это позволяет использовать много имен файлов.

    Оптимальным будет подсчитать, сколько у вас есть аргументов, и разделить полученное значение на количество заданий, которые вы хотите выполнять параллельно. например.

    t=32
    numfiles=$(find.//. -name '*.mp4' | grep -c //)
    let n=numfiles/t
    find. -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
    

Примечание:-Pне является стандартной опцией POSIX для xargs. Требуется GNU или *BSD xargs. Возможно и другие версии.

0
28.07.2021, 11:33

Теги

Похожие вопросы