web-dev-qa-db-ja.com

MD5ハッシュ値はBashおよびPHPとは異なります

"hello"という文字列の MD5 和(md5sumを使用)を生成しようとしました。私はLinuxのmd5sumツール、PHPのMD5()関数、そしてmd5sum翻訳者へのさまざまなオンラインテキストとして、さまざまな方法を試しました。

echo "hello" | md5sum

そして

echo "hello" > file && md5sum file

結果をb1946ac92492d2347c6235b4d2611184にします。しかし、PHPのmd5()関数とほとんどすべてのオンラインジェネレータが5D41402ABC4B2A76B9719D911017C592という出力をしていました。

理由は何ですか?

60

デフォルトでは、echoは出力の最後に改行文字を含みます。ただし、PHPおよび使用したオンラインサイトには改行は含まれません。改行文字を表示しないようにするには、-nフラグを使用します。

echo -n "hello" | md5sum

出力:

 5d41402abc4b2a76b9719d911017c592  -  

参照してください:help echo


またはprintfを使うと

printf "%s" "hello" | md5sum
79
Cyrus

@ Cyrusの答えは、これをどのように解決するかという点にきちんと合っています - 説明として、echoを使うとき、それは文字列の最後に改行を出力します。このオンライン出力でわかるように、改行付きのhelloは以前に取得したMD5を正確に出力します。 -nを使うことは改行を抑制し、そしてあなたにあなたが期待した結果を与えるでしょう。

enter image description here

編集

hexdumpに出力すれば、はっきりとわかります。そこにはバイトの16進数が表示されます。

$ echo "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65 0a              |str_example.|

文字列の最後にある0a\n)を参照してください。

$ echo -n "str_example" | hd
00000000  73 74 72 5f 65 78 61 6d  70 6c 65                 |str_example|

-nでは、echoは最後に新しい行(\n)を挿入しません。

今空の文字列で

$ echo  "" | hd
00000000  0a                                                |.|

改行文字だけ

$ echo -n  "" | hd

空の文字列なので、hexdumpは出力を表示しません

100
Jonno