大家好,又见面了,我是你们的朋友全栈君。
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等 这里以hashlib举例:
import hashlib
md=hashlib.md5()
md.update("你好")
md=md.hexdigest()
print(md)
出现以下错误:
D:\PycharmProjects\untitled\venv\Scripts\python.exe D:\PycharmProjects\untitled\myself\test2.py
Traceback (most recent call last):
File "D:\PycharmProjects\untitled\myself\test2.py", line 4, in <module>
md.update("你好")
TypeError: Unicode-objects must be encoded before hashing
由上图可知我们是没有对字符串进行编码 因为update()的括号里不支持将字符串对象引入,因为哈希在字节上工作,而不在字符或字符串上工作。通俗点说就是,必须要将update括号里的字符串以一种编码格式(最好是utf-8)进行编码,转换为字节(bytes)格式
所以update后面的括号里的字符串必须进行编码,转换成字节
hexdigest(…) 以16进制形式返回加密内容 这里以hashlib中md5加密为例:
#三种编码模式
#1.
import hashlib #导入hashlib模块
md=hashlib.md5() #将hashlib.md5的算法赋值给md
md.update("你好".encode('utf-8')) #先将你好这个字符串以utf-8编码转换成bytes(字节)格式,再存入到md变量中,因为update中只能存入bytes(字节)
md=md.hexdigest() #hexdigest(…) 以16进制形式返回加密内容
print(md)
#结果:7eca689f0d3389d9dea66ae112e5cfd7
#2.
import hashlib #导入hashlib模块
md=hashlib.md5() #将hashlib.md5的算法赋值给md
md.update(bytes("你好",encoding='utf-8')) #先将你好这个字符串以utf-8编码转换成bytes(字节)格式,再存入到md变量中,因为update中只能存入bytes(字节)
md=md.hexdigest() ##hexdigest(…) 以16进制形式返回加密内容
print(md)
#结果:7eca689f0d3389d9dea66ae112e5cfd7
#3.
import hashlib #导入hashlib模块
md=hashlib.md5()
md.update(b'123abc') #这里是直接将b后面单引号里的字符转换为字节,b后面只能是数字或字母,不能是中文;因为b单引号里的内容默认是使用ASCII进行编码,引号中不能出现中文,只能是字符
md=md.hexdigest() #hexdigest(…) 以16进制形式返回加密内容
print(md)
#结果:a906449d5769fa7361d7ecc6aa3f6d28
与hexdigest对应的还有: digest(…) 以字符形式返回加密内容
import hashlib #导入hashlib模块
md=hashlib.md5()
md.update("你好".encode('utf-8'))
md=md.digest() #digest(…) 以字符形式返回加密内容
print(md)
#结果:b'~\xcah\x9f\r3\x89\xd9\xde\xa6j\xe1\x12\xe5\xcf\xd7'
注:字符不同于字符串,字符是指计算机中使用的文字和符号,不是字节,例如1、2、3、a、b、c、A、B、C、~、@、#、¥、%、\、/等等
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/133453.html原文链接:https://javaforall.cn