ZaLinux.ru

Как при использовании md5sum выводить только хеш без имени файла

Как вычислить MD5 хеш файла

Программа md5sum предназначена для вычисления контрольной суммы MD5 файлов и строк. Также программа может сверять правильность MD5 хеша для указанного файла.

Для вычисления MD5 хеша файла выполните команду вида:

md5sum ФАЙЛ

Вы получите хеш файла за которым следует имя этого файла:

1e13e0919233605aba9b88706ad498aa ФАЙЛ

Чтобы вычислить MD5 хеш строки используйте команду вида (обратите внимание на опцию -n при echo — она обязательна, иначе хеш будет вычислен неверно):

echo -n 'СТРОКА' | md5sum

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

3f01ebc18e4cb2f471fc3964c098e7b3  -

Вместо имени файла показана чёрточка (-) это означает, что файл или строка получены по стандартному вводу.

Имя файла или чёрточка иногда не нужны — например, при использовании в скриптах. Рассмотрим, как можно использовать md5sum чтобы не выводилось имя файла.

У программы md5sum не предусмотрена опция для показа только хеша без файла, видимо, это связано с предназначением программы md5sum — вычислять хеш в формате, который пригоден для использования в этой же программе для последующей верификация целостности файла. Поэтому единственный выход — тем или иным образом обрезать данные.

1. Извлечение первого поля в awk

Следующая команда передаст рассчитанный хеш с именем файла в awk, которая отобразит только первое поле:

md5sum ФАЙЛ | awk '{ print $1 }'

2. Трюк с использованием массивов

Присвоим вычисленный хеш и имя файла массиву. В массивах Bash к первому элементу можно обратиться просто по имени без индекса [0], то есть в следующих командах $md5 содержит только 32 символа из вывода md5sum:

md5=($(md5sum ФАЙЛ))
echo $md5

Выведет только хеш:

1e13e0919233605aba9b88706ad498aa

3. Обрезка строки с cut

Команда cut может обрезать данные, разбив их на поля. Например, в следующей команде разделителем для команды cut указывается пробел (cut -d ' '), и следующая опция указывает, что нужно вывести только первое поле (-f 1):

md5sum ФАЙЛ | cut -d ' ' -f 1

Альтернативный вариант:

md5sum ФАЙЛ | cut -c 1-32

Первый пример можно использовать с кэшем любой длины, например, можно перейти от md5sum к sha256sum и команда по-прежнему будет применимой. Во втором варианте нужно каждый раз знать, сколько символов содержится в хеше.

Как проверить файл в md5sum, если имеется только MD5 хеш

Для сверки файла с MD5 хешем в md5sum, эта программа требует файл с md5 хешем в формате:

[md5-ХЕШ][ПРОБЕЛ][ПРОБЕЛ][ИМЯ-ФАЙЛА]

К примеру, если хеш сохранён в файл test.txt.md5, то проверка выполняется так:

md5sum -c test.txt.md5

Проверяемые файлы указывать нельзя, поскольку их имена берутся из файла test.txt.md5.

Возможна ситуация, что файл test.txt.md5 содержит только MD5 хеш (без пробелов и имени файла) — в этом случае проверка хеша завершится неудачей.

Итак:

  • test.txt — файл, который нужно сверить по хешу
  • test.txt.md5 — файл с хешем (без имени файла внутри)

Поскольку имя файла известно, мы можем просто напечатать содержимое файла с хешем, пару пробелов и затем имя файла и всё это передать в md5sum:

cat test.txt.md5 
5a6d311c0d8f6d1dd03c1c129061d3b1
md5sum -c <(printf "%s  test.txt\n" $(cat test.txt.md5)) 
test.txt: OK

Другая опция — добавить имя файла в файл с хешем:

sed -i  's/$/  test.txt/' test.txt.md5
md5sum -c test.txt.md5 
test.txt: OK

Можно заново посчитать контрольную сумму MD5 для файла и сравнить её с хранимой в test.txt.md5:

cmp test.txt.md5 <(md5sum test.txt | cut -d\ -f1)

Вариант этой же команды:

md5sum test.txt | cut -d' ' -f1 | cmp test.txt.md5

md5sum очень медленный! Альтернатива md5sum

При вычислении одного хеша скорость md5sum не является значимой. Но рассмотрим пример, когда нужно использовать md5sum множество раз.

Следующая команда maskprocessor создаст файл 6.txt со строками от 000000 до 999999 — то есть всего 1 миллион строк:

maskprocessor ?d?d?d?d?d?d > 6.txt

Теперь вычислим хеш каждой из этой строки:

cat 6.txt | while read -r line ; do echo -n $line | md5sum | awk '{print $1}'; done > md5.txt

Вычисление миллиона хешей MD5 на современном компьютере займёт десятки минут.

Но эту же самую задачу (расчёт MD5 хеша для всех строк в диапазоне 000000…999999, можно решить в PHP:

<?php
 
for ($i = 0; $i <= 999999; $i++) {
    echo md5 (str_pad( "$i", 6, "0", STR_PAD_LEFT )) . PHP_EOL;
}

Сохраните приведённый выше код в файл md5-rb-gen.php, запустите следующим образом:

php md5-rb-gen.php

Чтобы сохранить полученные хеши в файл:

php md5-rb-gen.php > md5.txt

Проверим затраченное время:

time php md5-rb-gen.php

Вывод:

real	0m3,973s
user	0m0,540s
sys	0m1,381s

То есть на вычисление миллиона хешей понадобилось менее четырёх секунд.

Смотрите, кстати «Как запустить PHP скрипт без веб-сервера».

И также смотрите статью «Хеши: определение типа, подсчёт контрольных сумм, нестандартные и итерированные хеши».

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *