将字符串转换为MD5

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

1
另外,最好避免在不太特殊的应用程序中使用“特殊词语”。例如,“string”是一个模块的名称。即使这不是一个错误,但尽可能避免歧义是最好的。 - Sheena
4个回答

27
正如错误提示所述,您的字符串必须是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()

16

不要尝试对字符串进行哈希处理,而要对编码后的字节序列进行哈希处理。与其

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

在Python 2中,你可以不这样做,但这会导致很多未被注意到的错误。幸运的是,Python 3拥有更加合理的Unicode支持,并区分字节和字符串。


2

1
所有上述的答案都可以正常运行。您还可以尝试使用以下函数:

import hashlib

def md5hasher(what_text):       
    return hashlib.md5(what_text.encode("utf")).hexdigest()

试一下!

md5hasher(your_text_to_encrypt)

你的输出将是使用123456作为待加密文本

"e10adc3949ba59abbe56e057f20f883e"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接