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支持,并区分字节和字符串.
| 归档时间: |
|
| 查看次数: |
35306 次 |
| 最近记录: |