字符串转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

原文由 spenman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 735
2 个回答

正如错误提示的那样,您的 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()

原文由 Day 发布,翻译遵循 CC BY-SA 3.0 许可协议

与其尝试对字符串进行哈希处理,不如对编码的字节序列进行哈希处理。代替

>>> 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 支持,并且区分字节和字符串。

原文由 DSM 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进