破棄されたブログ

このブログは破棄されました。

PHP の md5() 関数と md5sum コマンドの返す結果違うわけ

PHPmd5() 関数が返す結果と、md5sum コマンドの返す結果が異なっていたので、また PHP のクソ仕様かと思ったら自分の頭がクソ仕様だった。
md5sum コマンドも md5() 関数も与えられた値を RFC 1321 にしたがって忠実に計算して返していました。ごめんなさい。

PHP

<?php
// ea703e7aa1efda0064eaa507d9e8ab7e を表示する
echo md5('hoge');
?>

md5sum

# c59548c3c576228486a1f0037eb16a1b を表示する
echo 'hoge' | md5sum 

なぜ違うかと言うと、少なくとも bash では、 echo は最後に改行コードを吐き出すから。
od コマンドでダンプしてみると、-n オプションを追加しなかった場合に改行コードが吐き出されているのがわかる。
この環境の場合、 UTF-8 で改行コードが LF なので U+000A が吐き出されている。

$ echo 'hoge' | od -t x2
0000000 6f68 6567 000a
0000005
$ echo -n 'hoge' | od -t x2
0000000 6f68 6567
0000004

したがって、PHPmd5() 関数と同じ結果を得たいならば、echo に -n オプションを指定するようにする。
というか、普通に期待する結果は、改行コードを含まないものなので、echo した文字列をパイプで md5sum コマンドに渡すには、 -n オプションは必須。

# ea703e7aa1efda0064eaa507d9e8ab7e を表示する
echo -n 'hoge' | md5sum 
広告を非表示にする