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


60

文字列「hello」のMD5サム(md5sumを使用)を生成しようとしました。Linuxのmd5sumツール、PHPのMD5()関数、およびmd5sumトランスレーターへのさまざまなオンラインテキストとして、さまざまな方法を試しました。

echo "hello" | md5sum

そして

echo "hello" > file && md5sum file

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

理由は何ですか?


38
echo -n "hello"
マーティンヨーク

回答:


80

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

echo -n "hello" | md5sum

出力:

5d41402abc4b2a76b9719d911017c592-

見る: help echo


またはprintfを使用:

printf "%s" "hello" | md5sum

POSIXで指定されていない動作に依存する形式の前に、より広く互換性のある形式を示すことをお勧めします。
チャールズダフィー

ありがとうございました。私は彼自身の例とエコーの振る舞いで最初に問題を示すことを好みます。
サイラス

7
OPのオペレーティングシステムを知らない限り、「独自の例」の修正版が実際に機能することはわかりません。Linuxが削除されたBusyboxを使用している場合、echo -nエコー-nする可能性があります。
チャールズダフィー

OPのオペレーティングシステムを知っています。
サイラス

彼らはカーネルを指定しますが、それ以上のことをどこで言いますか?
チャールズダフィー

100

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

ここに画像の説明を入力してください

編集

に出力するとhexdump、16進数の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エコーは、(改行を入れていない\n最後に)

空の文字列で

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

改行文字だけ

$ echo -n  "" | hd

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


2
パイプへのより興味深いものになるだろうecho helloecho -n hellohexdump -Cそれぞれ;)
トム・ヤン

19
これはecho -n非標準であり、一貫してサポートされていないため推奨します(Sven Mascheckによる単一のUnix仕様echoおよび非互換性の詳細なカタログを参照してください)。一貫して機能させるには、printf代わりに使用します。使用するのはもう少し複雑です(印刷するデータに加えて書式文字列を指定する必要があります)が、トラブルを避けるために価値のあるIMOです。この場合、printf "%s" "hello"トリックを行います。
ゴードンデイヴィソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.