2016-10-17 15 views
0

私はPerlライブラリをPythonに移植しています。私はPythonに慣れていますが、Perlではそれほど多くはありません。Perl Digest :: MD5の機能に相当するPython

PerlコードはDigest::MD5を使用しています。このモジュールは、3つの機能を有する:

  • md5($data)はデータを取り込み、MD5はバイナリ
  • md5_hex($data)ダイジェスト吐き出すするデータを取り込み、MD5は
  • md5_base64($data)データとスピット取り込みヘクスにダイジェスト吐き出しますベース64エンコーディングでmd5ダイジェストを出力

私はこのようなものでmd5_hexを複製できます:

import hashlib 
string = 'abcdefg' 
print(hashlib.md5(string.encode()).hexdigest()) 

これはうまくいく(同じ入力は少なくとも同じ出力を与える)。私は他の2つの機能に一致するものは得られないようです。

これは、その文字列のエンコーディングが本当に私は多くをやった何かではありません助けていません。

import hashlib 
import base64 
string = 'abcdefg' 
md5_string = hashlib.md5(string.encode()).hexdigest() 
print(base64.b64encode(md5_string)) 

が、おそらくそれは間違っている:私は、彼らがダイジェストMD5を取ってから、このようなバイナリまたはBase64に再エンコード、何か言うようにPerl関数を解釈してきましたか?私はちょうど欠けている基本的なものがあると確信しています。

Perlのドキュメントはここにある: https://metacpan.org/pod/Digest::MD5

+1

明らかに、ハッシュの16進表現ではなく、ハッシュ自体をBase64でエンコードする必要はありません。 –

+0

大きなファイルのMD5を計算する場合は、次の解決策を検討してください。http://stackoverflow.com/questions/1131220/get-md5-hash-of-big-files-in-python/40961519#40961519 –

答えて

3

最初のものは、単にmd5.digestメソッドを呼び出すことになります。

>>> from hashlib import md5 
>>> s = 'abcdefg' 
>>> md5(s.encode()).digest() 
b'z\xc6l\x0f\x14\x8d\xe9Q\x9b\x8b\xd2d1,Md' 

そしてmd5_base64ダイジェストが、base64でエンコードされている:

>>> base64.b64encode(md5(s.encode()).digest()) 
b'esZsDxSN6VGbi9JkMSxNZA==' 

しかし、Perlは埋め込まれたハッシュを返さないため、互換性があります=パディング文字を削除:

>>> base64.b64encode(md5(s.encode()).digest()).strip(b'=') 
b'esZsDxSN6VGbi9JkMSxNZA' 
+0

'md5 (s.encode())。digest() 'は' md5_hex 'と等価ではありません –

+0

ありがとうございました! – user1781837

0

まず、Digest::MD5ドキュメントを注意してください:base64でエンコードされた文字列が返されることを

注4バイト長の倍数に水増しされていません。他のbase64でエンコードされたmd5ダイジェストとの相互運用性が必要な場合は、冗長文字列 "=="を結果に追加することができます。

第二に、あなたはBase64でしたいことに注意ハッシュではなく、それを16進数表現をエンコード:

print(base64.b64encode(hashlib.md5(string.encode()).digest())) 

esZsDxSN6VGbi9JkMSxNZA==

perl -MDigest::MD5=md5_base64 -E 'say md5_base64($ARGV[0])' abcdefg 

esZsDxSN6VGbi9JkMSxNZA

+0

私はAntti Haapalaの答えを選択しました。なぜなら彼はバイナリケースもカバーしていたからです。しかし、これはbase64パートにとって非常に良いことです。ありがとうございました! – user1781837

関連する問題