0

以前に質問があり、読者は代わりに hexdigest() を使用するよう求められました。...そしてそれは機能します。しかし、ダイジェストのフォーマットの構造は何ですか?

次のテスト コード:

import hashlib, base64
f1 = open('foo.jpeg', 'rb')    
m = hashlib.sha512()
m.update(f1.read())
sha = m.digest()
print(m.digest())
print(m.hexdigest())
res = base64.b64encode(sha)
print( res)

次の出力が生成されます。

>>> 
b'\xf3g\xd1S\xc4#OK\xb8\xb7\x1f~r\xf0\x19JE\xb0d\xb9\x11O\x08\x1c\xc66\x00\xb3i*\x87\x08\x92+\xd3)F\x02\t\x80\xf0m\x8b;\x9c\xcdq\xbd\xb9\x92k\x7f}d\t\xc65\x12\x0b\x17\xf9]5\x97'

f367d153c4234f4bb8b71f7e72f0194a45b064b9114f081cc63600b3692a8708922bd32946020980f06d8b3b9ccd71bdb9926b7f7d6409c635120b17f95d3597
>>> 

上記の出力の最初の行にある「#OK」、「~r」、「i*」などの部分の意味がわかりません。これに光を当てていただければ幸いです。もちろん、hexdigest() の出力は完全に理にかなっています。

前の質問: hashlib.sha256 が Python で奇妙な文字を返しました。どうもありがとう。

4

2 に答える 2

2

sha512 のようなハッシュ関数の出力は、512 ビット文字列または 64 バイト文字列です。したがって、 の結果はm.digest長さ 64 のバイト オブジェクトです。出力は疑似ランダムであるため、ハッシュの「#OK」はまったくの偶然です。の出力はm.hexdigest、16 進数としてエンコードされた同じバイトです。

于 2013-08-11T16:57:42.483 に答える
1

Pythonリファレンスの状態として:

hash.digest()

これまでにメソッドに渡された文字列のダイジェストを返しupdate()ます。これは、digest_sizenull バイトを含む非 ASCII 文字を含む可能性のあるバイト文字列です。

表示されるのは、これまでのダイジェストのバイト表現です。

ASCII チャートを見ると、一部のバイトが印刷可能な文字として表現できることがわかります。たとえば、ダイジェストの 2 番目のバイト (hex 67) は文字をエンコードしますgが、最初のバイト (hex f3) は印刷可能な文字として表すことができないため、 として出力され\xf3ます。

于 2013-08-11T17:00:40.137 に答える