14

文字列からハッシュコードへの基本的なコンバーターを作成しようとしてい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
4

3 に答える 3

26

エラーが示すように、stringUnicode である必要があり、エンコードする必要があります。(スタックトレースから)行った呼び出しを見る:

computeMD5hash("The quick brown fox jumps over the lazy dog")

文字列が Unicode オブジェクトである Python 3 を実行している必要があるようです。hashlib で処理できるバイト表現にエンコードするには、これを変更します。

m.update((string))

これに(utf-8が適切なエンコーディングである場合-これをどのように使用するかによって異なります):

m.update(string.encode('utf-8'))

これがすべてのニュースである場合は、優れたPython 3 Unicode HOWTOを読む必要があります。


また、私がここにいる間、あなたのコードには他の問題があります

  • いくつかの不必要なビット -from hashlib import行または一時的な必要はありませんmd5string
  • 関数内からモジュールをインポートするのは悪い形式なので、import hashlibモジュール スコープに移動する必要があります。
  • 関数は生のバイナリである を返しています。スタック トレースから、16 進文字列として表されるものと同じものを代わりにdigest()期待しているように見えます。hexdigest()

すべてを修正して整理するには、これを試してください:

import hashlib

def computeMD5hash(my_string):
    m = hashlib.md5()
    m.update(my_string.encode('utf-8'))
    return m.hexdigest()
于 2012-11-06T21:41:15.163 に答える
14

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

>>> 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 ではより適切な Unicode サポートが提供されており、バイトと文字列が区別されます。

于 2012-11-06T21:38:59.790 に答える
2

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

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

于 2012-11-06T21:37:17.997 に答える