将String转换为MD5

spe*_*man 11 python string md5 python-3.x

好吧我正在尝试将字符串的基本转换器写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
Run Code Online (Sandbox Code Playgroud)

我的代码看起来像这样:

def computeMD5hash(string):
    import hashlib
    from hashlib import md5
    m = hashlib.md5()
    m.update((string))
    md5string=m.digest()
    return md5string
Run Code Online (Sandbox Code Playgroud)

Day*_*Day 23

正如错误所示,你string必须是unicode,你必须编码它.查看您的调用(从堆栈跟踪):

computeMD5hash("The quick brown fox jumps over the lazy dog")
Run Code Online (Sandbox Code Playgroud)

看起来你必须运行Python 3,其中字符串是unicode对象.要编码为可以由hashlib处理的字节表示,请更改此设置

m.update((string))
Run Code Online (Sandbox Code Playgroud)

对此(如果utf-8是适合您使用的编码 - 这取决于您将如何使用它):

m.update(string.encode('utf-8'))
Run Code Online (Sandbox Code Playgroud)

如果这对您来说都是新闻,您应该阅读优秀的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()
Run Code Online (Sandbox Code Playgroud)


DSM*_*DSM 11

您应该对编码的字节序列进行散列,而不是尝试对字符串进行散列.代替

>>> import hashlib
>>> hashlib.md5("fred")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
Run Code Online (Sandbox Code Playgroud)

你应该对它进行编码,例如:

>>> "fred".encode("utf")
b'fred'
>>> hashlib.md5("fred".encode("utf")).hexdigest()
'570a90bfbf8c7eab5dc5d4e26832d5b1'
Run Code Online (Sandbox Code Playgroud)

在Python 2中,你可以在不这样做的情况下逃脱,并且它导致了未被注意的错误.幸运的是,Python 3具有更好的unicode支持,并区分字节和字符串.