web-dev-qa-db-ja.com

文字列をMD5に変換する

さて、文字列を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
11
spenman

エラーが示すように、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()
_
24
Day

文字列をハッシュするのではなく、エンコードされたバイトシーケンスをハッシュする必要があります。の代わりに

>>> 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は、多くの賢いユニコードをサポートしており、区別されます。バイトと文字列の間。

11
DSM

ハッシュする前に文字列をエンコードする必要があるようです:

http://www.dreamincode.net/forums/topic/246026-generate-string-hash-issue/

2
gabga