Python3.7模块之hashlib

Python3.7模块之hashlibupdate()不支持将字符串对象引入,因为哈希在字节上工作,而不在字符上工作。所以update后面的括号里只能是字节(bytes)形式importhashlibmd=hashlib.md5()md.update(“你好”)md=md.hexdigest()print(md)出现以下错误:D:\PycharmProjects\untitled\venv\Scripts\pyt…

大家好,又见面了,我是你们的朋友全栈君。

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.net/133453.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 宝塔分销源码_云进销存ERP开发教程

    宝塔分销源码_云进销存ERP开发教程大家好啊,我是测评君,欢迎来到web测评。本期给大家带来一套电商ERP进销存系统源码。运行环境服务器宝塔面板PHP5.6Mysql5.6LinuxCentos7以上文字教程下载源码,宝塔添加一个站点,创建一个数据库,导入数据库文件目录下的taoydm.sql修改数据库链接文件application\config\database.php(记得不要用记事本修改,否则可能会出现验证码显示不了问题,建议用Notepad++)压缩codes目录下的源码上传到宝塔新建网站的根目录后解压缩默认后

    2022年9月20日
    3
  • centos7.6安装docker_centos docker安装部署

    centos7.6安装docker_centos docker安装部署前言前面一篇学了mac安装docker,这篇来学习在linux上安装docker环境准备Docker支持以下的CentOS版本,目前,CentOS仅发行版本中的内核支持Docker。Doc

    2022年7月31日
    7
  • 【ThinkingInJava】6、测试自己的输出类库

    【ThinkingInJava】6、测试自己的输出类库/***书本:《ThinkingInJava》*功能:定制工具库,用于System.out.println的简化*文件:Print.java*时间:2014年10月7日19:45:31*作者:cutter_point*/packagenet.mindview.util;importjava.io.*;importjavax.print.attribute.

    2022年7月9日
    22
  • linux yum下载_虚拟机配置yum源

    linux yum下载_虚拟机配置yum源文章目录一.软件包管理1.RPM包管理2.源码包二.软件的安装工具1.YUM工具2.RPM工具一.软件包管理1.RPM包管理Red Hat Package Manager包的命名规则:软件名,版本号,发行版本,系统平台(32/64),后缀是.rpm**特点:**二进制包,无需编译,可以直接使用**缺点:**无法设定个人设置,开关功能2.源码包特点:需要经过gcc等编译环境编译才能运行,可以设定个人设置,开关功能缺点:配置复杂二.软件的安装工具1.YUM工具Yellow dog Upd

    2022年8月9日
    8
  • mysql中多表嵌套查询例子_mysql子查询嵌套规则

    mysql中多表嵌套查询例子_mysql子查询嵌套规则本文实例分析了MySQL嵌套查询。分享给大家供大家参考,具体如下:MySQl从4.11版后已经完全支持嵌套查询了,那么下面举些简单的嵌套查询的例子吧(源程序来自MySQLUserManual):1.SELECT语句的子查询语法:代码如下:SELECT…FROM(subquery)ASname…先创建一个表:CREATETABLEt1(s1INT,s2CHAR(…

    2022年10月21日
    3
  • 800个有趣句子帮你记忆7000个单词[通俗易懂]

    800个有趣句子帮你记忆7000个单词[通俗易懂]800个有趣句子帮你记忆7000个单词   1.WithmyownearsIclearlyheardtheheartbeatofthenuclearbomb.我亲耳清楚地听到原子弹的心脏的跳动。 2.Nextyearthebeardedbearwillbearadearbabyintherear.明年,长胡子的熊将

    2022年6月7日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号