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

正如错误所暗示的那样,您string必须是 unicode 并且您必须对其进行编码。查看您所做的调用(来自您的堆栈跟踪):

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()是与表示为十六进制字符串相同的东西。

要修复和整理所有内容,请尝试以下操作:

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 回答