Esta pergunta já tem uma resposta aqui:
Eu tentei gerar a soma MD5 (usando md5sum) de uma string, "olá". Tentei métodos diferentes como a ferramenta md5sum no Linux, a função MD5 () do PHP, bem como vários textos online para tradutores do md5sum.
echo "hello" | md5sum
e
echo "hello" > file && md5sum file
Deu o resultado b1946ac92492d2347c6235b4d2611184
. No entanto, a função md5 () do PHP e quase todos os geradores online forneceram a saída 5D41402ABC4B2A76B9719D911017C592
.
Qual é a razão?
Respostas:
Por padrão,
echo
inclui um caractere de nova linha no final da saída. No entanto, o PHP e os sites online que você usou não incluem a nova linha. Para suprimir o caractere de nova linha, use o-n
sinalizador:Resultado:
Vejo:
help echo
ou com printf:
fonte
echo -n
podem ecoar-n
se o Linux estiver usando um Busybox despojado.A resposta de @ Cyrus está exatamente no ponto de como resolver isso - para explicar, ao usá-
echo
lo, será exibida uma nova linha no final da string. Como você pode ver nesta saída online,hello
com uma nova linha gera exatamente o MD5 que você estava recebendo anteriormente. O uso-n
suprime a nova linha e fornece o resultado esperado.Editar :
Você pode vê-lo claramente se você o fizer
hexdump
, o que mostra o hexadecimal dos bytes lá.Veja the
0a
(\n
) no final da stringCom
-n
eco não coloca uma nova linha (\n
) no finalAgora com uma string vazia
Apenas o caractere de nova linha
String vazia, portanto
hexdump
não mostra saídafonte
echo hello
eecho -n hello
parahexdump -C
respectivamente;) #echo -n
, já que é fora do padrão e é suportado de maneira inconsistente (consulte a Single Unix Spececho
e um catálogo mais detalhado de incompatibilidades de Sven Mascheck ). Se você deseja que ele funcione consistentemente, useprintf
; é um pouco mais complexo de usar (você precisa especificar uma sequência de formatos além dos dados que deseja imprimir), mas a IMO vale a pena para evitar problemas. Nesse caso,printf "%s" "hello"
fará o truque.