hashlib.md5()TypeError:必须在散列之前对Unicode对象进行编码

Sha*_*hab 20 python hash encoding python-3.x

我是编码的新手,并且在尝试编码字符串时遇到了问题.

>>> import hashlib
>>> a = hashlib.md5()
>>> a.update('hi')
Traceback (most recent call last):
  File "<pyshell#22>", line 1, in <module>
    a.update('hi')
TypeError: Unicode-objects must be encoded before hashing
>>> a.digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'
Run Code Online (Sandbox Code Playgroud)

(a)现在被认为是编码的吗?

第二个问题:当我在脚本中运行上面相同的代码时,我收到此错误:

import hashlib
a = hashlib.md5()
a.update('hi')
a.digest()
Run Code Online (Sandbox Code Playgroud)

回溯(最近一次调用最后一次):文件"C:/ Users/User/Desktop/Logger/Encoding practice.py",第3行,a.update('hi')TypeError:必须在散列之前对Unicode对象进行编码

为什么代码在shell中工作而不是脚本?我正在使用Windows和Python 3.4

谢谢.

小智 21

我发现的解决方案是简单地将数据编码在你正在散列它的行中:

hashlib.sha256("a".encode('utf-8')).hexdigest()

它对我有用,希望它有所帮助!


Ste*_*nes 19

由于您编写简单的字符串,我推断您运行的是Python 3,其中所有字符串都是unicode对象,您有两种选择:

  1. 为字符串提供编码,例如: "Nobody inspects".encode('utf-8')
  2. 使用手册中显示的二进制字符串:

    m.update(b"Nobody inspects")
    m.update(b" the spammish repetition")
    
    Run Code Online (Sandbox Code Playgroud)

脚本与shell的行为不同的原因是脚本在错误上停止,而在shell中,最后一行是单独的命令,但由于先前的错误,仍然没有按照您的意愿执行操作.


Ign*_*ams 4

它在 REPL 中不起作用。它没有进行任何哈希处理,因为您没有向它传递任何有效的哈希值。首先尝试编码。

3>> hashlib.md5().digest()
b'\xd4\x1d\x8c\xd9\x8f\x00\xb2\x04\xe9\x80\t\x98\xec\xf8B~'
3>> a = hashlib.md5()
3>> a.update('hi'.encode('utf-8'))
3>> a.digest()
b'I\xf6\x8a\\\x84\x93\xec,\x0b\xf4\x89\x82\x1c!\xfc;'
Run Code Online (Sandbox Code Playgroud)