さて、文字列をmd5
ハッシュコードに変換する基本的なコンバータを作成しようとしていますが、プログラムを実行すると、次のようなエラーが発生します。
Traceback (most recent call last):
File "C:\Users\Shane\Documents\Amer CISC\lab4.py", line 30, in <module>
assertEqual (computeMD5hash("The quick brown fox jumps over the lazy dog"),("9e107d9d372bb6826bd81d3542a419d6"))
File "C:\Users\Shane\Documents\Amer CISC\lab4.py", line 27, in computeMD5hash
m.update(string)
TypeError: Unicode-objects must be encoded before hashing
私のコードは次のようになります:
def computeMD5hash(string):
import hashlib
from hashlib import md5
m = hashlib.md5()
m.update((string))
md5string=m.digest()
return md5string
エラーが示すように、string
はユニコードである必要があり、エンコードする必要があります。 (スタックトレースから)行った呼び出しを見る:
_computeMD5hash("The quick brown fox jumps over the lazy dog")
_
実行している必要があるようですPython 3ここで、文字列はUnicodeオブジェクトです。hashlibで処理できるバイト表現にエンコードするには、これを変更します
_m.update((string))
_
これに(utf-8が使用するのに適切なエンコーディングである場合-これをどのように使用するかによって異なります):
_m.update(string.encode('utf-8'))
_
これがすべてあなたにとってのニュースであるなら、あなたはおそらく素晴らしい Python 3 Unicode HOWTO を読むべきです。
また、私がここにいる間、あなたのコードには他のいくつかの問題があります
from hashlib import
_行または一時的な_md5string
_は必要ありません。import hashlib
_をモジュールスコープに移動する必要があります。digest()
を返し、スタックトレースからは hexdigest()
を期待しているように見えます。 =代わりに、これは16進文字列として表されるものと同じものです。すべてを修正して整理するには、次のことを試してください。
_import hashlib
def computeMD5hash(my_string):
m = hashlib.md5()
m.update(my_string.encode('utf-8'))
return m.hexdigest()
_
文字列をハッシュするのではなく、エンコードされたバイトシーケンスをハッシュする必要があります。の代わりに
>>> import hashlib
>>> hashlib.md5("fred")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
エンコードする必要があります。例:
>>> "fred".encode("utf")
b'fred'
>>> hashlib.md5("fred".encode("utf")).hexdigest()
'570a90bfbf8c7eab5dc5d4e26832d5b1'
Python 2では、これを行わなくても逃げることができ、見過ごされていたバグの終わりはありませんでした。幸い、Python 3は、多くの賢いユニコードをサポートしており、区別されます。バイトと文字列の間。
ハッシュする前に文字列をエンコードする必要があるようです:
http://www.dreamincode.net/forums/topic/246026-generate-string-hash-issue/