Pythonによって作成されたMD5ハッシュが、シェルでechoとmd5sumを使用して作成されたものと異なるのはなぜですか?


109

Python MD5ハッシュは、シェルでmd5sumコマンドによって作成されたものとは異なります。どうして?

>>> import hashlib
>>> h = hashlib.md5()
>>> h.update("mystringforhash")
>>> print h.hexdigest()
86b6423cb6d211734fc7d81bbc5e11d3 # Result from Python


$ echo mystringforhash | md5sum
686687dd68c5de717b34569dbfb8d3c3  - # Result on the shell

回答:


198

echo\n通常はシェルで改行で終わらないようにしたくないので、を追加します(プロンプトが左端から始まらない場合は、見苦しく見えます)。引数を
使用し-nて末尾の改行を省略し、Pythonスクリプトと同じチェックサムを出力します。

> echo -n mystringforhash | md5sum
86b6423cb6d211734fc7d81bbc5e11d3  -

53
実際、これは私が人々にシェルスクリプトではなく、より多くのPythonまたはより高いレベルの言語を使用するように指示するときに私が使用する大きな例の1つです。混合データとコードの性質、および各コマンドの異なる構文により、シェルスクリプトは目に見えないほどエラーが発生しやすくなります
jsbueno

7
与えられたものだけが「シェル」である場合echo、実行可能な-nフラグを持つことは信頼できません。POSIXは次のように述べていますecho。「最初のオペランドが-nである場合、またはいずれかのオペランドに<backslash>文字が含まれている場合、結果は実装定義です。」(ソース:pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html)。printf代わりに使用してください。
ミッコランタライネン

問題はエコーではなく、md5sum(現在のMacではmd5)とshasumにあり、末尾に\ nが追加されています
Punnerud

@Punnerud:いいえmd5sum。ここでの出力は関係ありません。入力は行います。そして、なしで-n、echoは改行を追加し、その結果、異なるハッシュになります。
ThiefMaster 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.