将字符串转换为MD5

2024-06-11 07:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

好的,我正在尝试将字符串的基本转换程序编写成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

Tags: 代码py程序stringlineusersmd5documents
3条回答

如错误所示,您的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应该移动到模块范围。
  • 函数返回的^{}是原始二进制文件,从堆栈跟踪来看,它似乎是期望的^{},而不是用十六进制字符串表示的相同内容。

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

import hashlib

def computeMD5hash(my_string):
    m = hashlib.md5()
    m.update(my_string.encode('utf-8'))
    return m.hexdigest()

似乎在散列之前必须对字符串进行编码:

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

与其试图散列字符串,不如散列一个已编码的字节序列。而不是

>>> 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'

在Python2中,您可以不这样做就离开,这导致了许多未被注意到的错误。幸运的是,Python 3对unicode的支持更加健全,并且能够区分字节和字符串。

相关问题 更多 >