質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

Q&A

解決済

1回答

4351閲覧

ハッシュ化について疑問があります

saisaijoe

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ハッシュ

ハッシュは、高速にデータ検索を行うアルゴリズムのことです。

0グッド

0クリップ

投稿2019/07/21 08:02

前提・実現したいこと

ハッシュについて勉強しています。
ハッシュ化するにはhashlib.アルゴリズム(文字列).hexdigest()でハッシュ化できると思うのですが、最後のhexdigest()を行う理由がわかりません。

該当のソースコード

python

1import hashlib 2 3block = {'b':2, 'a':1 } 4print(hashlib.sha256(str(block).encode())) 5print(hashlib.sha256(str(block).encode()).hexdigest())

実行結果

46e391c4281c162dc452a58d0a756ec6568ebe3acbd9d3731d1eccc66c23d17b
<sha256 HASH object @ 0x0000000003BDA198>

確かめたいこと

hexdigestを行わなくても16進数のハッシュが作られています。なぜhexdigestをするのでしょうか?
ハッシュ化は結果の文字列から復元できないこと、となっているためhexdigestする前のものでは復元が出来そう?だからhexdigestを最後に行って復元できないような複雑な文字列を作っているのでしょうか?

ご存知の方、教えてください。

環境

Python3.7.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

can110

2019/07/21 08:26

ソースコードと実行結果(表示の順番)が異なっているようですが、それで混乱されていませんか?
saisaijoe

2019/07/22 12:49

can110さん回答ありがとうございます。 申し訳ありません。実行結果の順番を逆に書いてしまいました。
guest

回答1

0

ベストアンサー

hashlib --- セキュアハッシュおよびメッセージダイジェスト
ドキュメントを読みましょう。
計算したダイジェスト(ハッシュ)値をバイト列ではなく、16進形式文字列で返しているだけです。
それと、比較すべき対象はdigest()です。

hash.digest() これまで update() メソッドに渡されたデータのダイジェスト値を返します。これは digest_size と同じ長さの、0 から 255 の範囲全てを含み得るバイトの列です。 hash.hexdigest() digest() と似ていますが、倍の長さの、16進形式文字列を返します。これは、電子メールなどの非バイナリ環境で値を交換する場合に便利です。

確認コード

Python

1import hashlib 2import binascii 3 4block = {'b':2, 'a':1 } 5hash = hashlib.sha256(str(block).encode()) 6 7print(hash) 8print(hash.digest()) 9print(str(binascii.hexlify(hash.digest()), 'utf-8')) 10print(hash.hexdigest())

結果

<sha256 HASH object @ 0x00000205C1845DF0> b'F\xe3\x91\xc4(\x1c\x16-\xc4R\xa5\x8d\nun\xc6V\x8e\xbe:\xcb\xd9\xd3s\x1d\x1e\xcc\xc6l#\xd1{' 46e391c4281c162dc452a58d0a756ec6568ebe3acbd9d3731d1eccc66c23d17b 46e391c4281c162dc452a58d0a756ec6568ebe3acbd9d3731d1eccc66c23d17b

投稿2019/07/21 08:40

編集2019/07/21 08:49
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

saisaijoe

2019/07/22 13:55

SHOMIさん回答ありがとうございます。 コードも教えていただき、自分の環境で実行して試してみました。 色々調べていくと、 hexdigestを利用すると変換対象の文字列が16進数の文字列になり、一般的にはこちらを利用すること。 また、hexdigestを利用しない場合のオブジェクト型はほぼ利用することはないこと。 digestはbyte列でこちらもあまり利用していないこと、がわかりました。 digestのbyte列からhexdigestの16進数への変換方法も教えていただき、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問