На этот вопрос уже есть ответ здесь:
Я попытался сгенерировать сумму MD5 (используя md5sum) для строки "hello". Я опробовал различные методы в качестве инструмента md5sum в Linux, функцию PHP MD5 (), а также различные онлайн-переводчики текста в md5sum.
echo "hello" | md5sum
а также
echo "hello" > file && md5sum file
Дал результат b1946ac92492d2347c6235b4d2611184
. Однако, PHP-функция md5 () и почти все онлайн-генераторы дали результат 5D41402ABC4B2A76B9719D911017C592
.
Какова причина?
Ответы:
По умолчанию
echo
включает символ перевода строки в конце вывода. Тем не менее, PHP и веб-сайты, которые вы использовали, не включают перевод строки. Чтобы подавить символ новой строки, используйте-n
флаг:Выход:
Видеть:
help echo
или с помощью printf:
источник
echo -n
может эхом,-n
если их Linux использует урезанный Busybox.Ответ @ Сайруса точно соответствует тому, как решить эту проблему - чтобы объяснить, при использовании
echo
он выведет новую строку в конце строки. Как вы можете видеть на этом онлайн-выводе,hello
с новой строкой выводится именно тот MD5, который вы получали ранее. Использование-n
подавляет символ новой строки, а затем даст вам ожидаемый результат.Редактировать :
Вы можете видеть это ясно, если вы выводите его в
hexdump
, который показывает шестнадцатеричное число байтов там.Смотрите
0a
(\n
) в конце строкиС
-n
эхо не ставит новую строку (\n
) в концеТеперь с пустой строкой
Просто персонаж Новой Линии
Пустая строка, поэтому
hexdump
не выводитсяисточник
echo hello
иecho -n hello
кhexdump -C
соответственно;)echo -n
, поскольку он нестандартный и несовместимо поддерживаемый (см. Единую спецификацию Unixecho
и более подробный каталог несовместимостей Sven Mascheck ). Если вы хотите, чтобы он работал последовательно, используйтеprintf
вместо этого; это немного сложнее в использовании (вы должны указать строку формата в дополнение к данным, которые вы хотите распечатать), но IMO стоит того, чтобы избежать проблем. В этом случаеprintf "%s" "hello"
сделаем свое дело.