1

先日Stackoverflowで私に与えられたPythonでのこの単純なhashlibコードを理解しようとしています:

import hashlib
m = hashlib.md5()
m.update("Nobody inspects")
m.update(" the spammish repetition here")
m.digest()
'\xbbd\x9c\x83\xdd\x1e\xa5\xc9\xd9\xde\xc9\xa1\x8d\xf0\xff\xe9'
m.digest_size
16
m.block_size
64
print m

print mこれで、「ここでスパムの繰り返しを検査する人はいません」というフレーズの MD5 ダイジェストが表示されると思いましたが、その結果、ローカル ホストに次の行が表示されました。

<md5 HASH object @ 01806220>

奇妙なことに、ページを更新すると、別の行が表示されました。

<md5 HASH object @ 018062E0>

更新するたびに、別の値を取得します。

md5 HASH オブジェクト @ 017F8AE0

md5 HASH オブジェクト @ 01806220

md5 HASH オブジェクト @ 01806360

md5 HASH オブジェクト @ 01806400

md5 HASH オブジェクト @ 01806220

なぜそうなのですか?たぶん、「@」が続く各行にあるのは、実際にはダイジェストではありません。では、それは何ですか?このコードで MD5 ダイジェストを表示するにはどうすればよいですか?

私のpythonバージョンはPython 2.5で、現在使用しているフレームワークはwebappです(「Google App Engine」からSDKと一緒にダウンロードしました)

4

2 に答える 2

3

hashlib.hashオブジェクトは独自のを実装しないため__str__、デフォルトの文字列への操作が使用され、クラス名の後にid(アドレス)が続きます。

.hexdigest()16進MD5文字列を取得するために使用します。)

于 2010-04-08T06:07:29.837 に答える
3
print m.hexdigest()

UPADATE:hexdigest()の別の表現を提供しdigest()ます。ダイジェスト内のすべての文字は、16進表現に変換されます。次の関数で変換できます。

def digest_to_hex(chars):  
  res = ''  
  for c in chars:  
    res = res + '%02x' % ord(c)  
  return res

ジェネレータ式を使用することもできます

''.join('%02x' % ord(x) for x in m.digest())

また

m.digest().encode('hex')

ところで:あなたdir(some_object)はその要素のリストを取得するために、そしてhelp(some_object)(インタラクティブインタプリタで)それについてのより多くの情報を取得するために使用することができます。

于 2010-04-08T06:07:48.773 に答える