hashlib笔记
-
hashlib的使用
首先要导入hashlib
-
hash摘要的算法主要有两类:md5和sha-XXX
-
hash加密的特点
-
hash算法生成的摘要不可逆(不能通过密文来获取原文)
-
只有相同的数据通过相同算法得到的摘要(密文)才是一致的
-
不管原数据多大,相同算法产生的摘要的长度或大小是一致的
-
hash()函数的用途
hash() 函数的对象字符不管有多长,返回的 hash 值都是固定长度的,
也用于校验程序在传输过程中是否被第三方(木马)修改,如果程序(字符)
在传输过程中被修改hash值即发生变化,如果没有被修改,则 hash 值和
原始的 hash 值吻合,只要验证 hash 值是否匹配即可验证程序是否带木马(病毒)。
-
-
生成哈希摘要
-
通过算法创建hash对象:hashlib.算法名()
算法名:md5、shaXXX
hash = hashlib.md5()
hash = hashlib.sha512()
-
添加数据
# hash对象.update(二进制数据) 数据必须是二进制数据,类型是bytes # 补充:二进制与字符串之间的相互转换: ''' 字符串转二进制: 1)bytes(字符串, encoding='utf-8') 2)字符串.encode() 二进制转字符串: 1)str(二进制, encoding = 'utf-8') 2)二进制.encode() ''' # hash.update(bytes('qeqe21', encoding='utf-8')) hash.update('123456'.encode()) # hash.update('1'.encode())
# 练习:判断合同是否被修改 hash = hashlib.md5() with open('合同.txt', 'rb') as f: hash.update(f.read()) result1 = hash.hexdigest() print(result1)
-
-
-
文件操作
-
数据持久化
''' a.程序中保存的数据默认都是保存在运行内存中的,在程序运行结束的时候都会自动释放。 b.如果希望本次运行程序产生的数据在下次程序运行的时候还能用,就需要将数据保存到硬盘中 c.将数据保存到硬盘的过程就是持久化过程,硬盘保存数据的单元是文件,如果要将数据保存到硬盘 中,只需要把数据保存到文件中 d.程序中数据持久化的常用文件类型:数据库文件(.db或者.sqlite等)、plist文件(开发常 用)、json文件、txt文件、二进制文件(图片、视频、音频、exe可执行文件) '''
-
文件操作——操作文件的内容
文件基本操作都是统一的:打开文件—> 操作文件(读、写)—> 关闭文件
-
打开文件
''' open(file, mode='r', *, encoding=None)——以指定方式打开指定文件,返回一个文件对象 1)file——需要打开的文件在计算机中的位置信息(文件路径),字符串 绝对路径:文件在计算机里边的全路径,一般从盘开始写 相对路径:a).——表示当前目录(当前代码文件所在的文件夹) b)..——表示当前目录的上层目录 2)mode——文件打开方式,决定打开文件后能够对文件进行的操作以及操作数据类型。 第一组:'r'、'w'、'a'——控制后续操作(读还是写)read、write、append 'r'——只读 'w'——只写(先清空源文件内容再写) 'a'——只写(保留源文件内容添加) 第二组:'t'、'b'——控制操作数据类型 txt、binary 注意:第一组必须选一个,第二组可以不选,不选时默认为't' 't'——读操作返回的数据和写操作写入的数据是字符串(str) 'b'——读操作返回的数据和写操作写入的数据是二进制(bytes) 注意:1)二进制文件打开的时候必须带b 3)encoding——文本文件的编码方式(需要保证写入数据采用的什么方式进行编码,就需要用什么方式进行解码) 一般采用utf-8,但是很多windows文本默认编码方式是gbk 注意:只有在以t的方式打开文本文件的时候,才需要给encoding赋值 '''
# ======================r, w, a======================== # # r——只读 f = open('./合同.txt', 'r', encoding='utf-8') f.read() f.close() # a——只写 f = open('./合同.txt', 'a') f.write('abc') f.close() # # w——只写 f = open('合同.txt', 'w', encoding='utf-8') f.write('你好,世界!') f.close() # =================t, b================= f = open('./合同.txt', 'rt', encoding='utf-8') content = f.read() print(type(content)) # 字符串 f.close() f = open('./合同.txt', 'rb') content = f.read() print(type(content)) # 二进制 f.close()
-
关闭文件
-
文件对象.close()
f = open('./合同.txt', 'rt', encoding='utf-8') f.close() # f.read() # I/O operation on closed file.关闭之后不能再读
-
-
操作
-
读操作
-
文件对象.read——从读写位置开始,读到文件文件结束(读写位置在文件开头)
-
文件对象.readline——从读写位置开始,读到一行结束位置
# 对象.seek(0)——将读写位置移动到开头 f = open('测试.txt', encoding='utf-8') print(f.read()) print('===============') f.seek(0) # 将读写位置移动到文件开头 print(f.read()) print('===============') f.seek(0) print(f.readline()) print('===============') print(f.readline()) print('===============') f.seek(0) print(f.readlines())
-
-
写操作
-
文件对象.write(数据)——将数据写入指定的文件夹中
f = open('测试.txt', 'a', encoding='utf-8') f.write('你好,世界!') f = open('测试.txt', 'w', encoding='utf-8') f.write('你好,世界!')
-
-
-
-
-
补充:eval函数
# 将eval函数中数据类型转化为数据本身类型 result = eval('100') print(result) # 100,int result = eval('12.5') print(result) # 12.5,float result = eval('[10, 20, 30]') print(result) # [10, 20, 30],list result = eval('''{ 'name': '小明', 'age': 18} ''') print(result)
-
怎样持久化数据
-
用一个文件来保存持久化数据
-
程序中需要这个数据的时候就从文件中读取这个数据
-
如果数据发生改变,需要把最新的数据写入文件中
练习:写一个程序,打印程序执行的次数
f = open('测试.txt', 'rt', encoding='utf-8') result = int(f.read()) + 1 print(result) open('测试.txt', 'w', encoding='utf-8') f.write(str(result)) f.close()
-