python代码-实现对文件内容的哈希
python代码-实现对文件内容的哈希
import hashlib import base64 # 对文件内的数据进行sha1哈希运算。迭代方式,可以处理大文件 def SHA1FileWithName(fileName, out_is_base64_bytes=True, block_size=64 * 1024): '''sha1 file with filename (SHA1) :param fileName: 文件名 :param out_is_base64_bytes: 输出类型。True返回按照base64编码后的字节流。False返回16进制的字符串 :param block_size: 每次读取文件中的数据量 :return: 按照out_is_base64_bytes的条件返回 ''' with open(fileName, 'rb') as f: sha1 = hashlib.sha1() while True: data = f.read(block_size) if not data: break sha1.update(data) # 如果输出base64编码后的字节流bytes。 if out_is_base64_bytes: # 以二进制的字节流返回。如:b'\xc0c\x96\xce\x1c\xd9i\xe1\xbfi\xb7\xb4\xf8:\x1e\xa5' sha1_bin_bytes = sha1.digest() print(sha1_bin_bytes) # 将二进制的字节流按照base64规则编码,返回base64的字节流。如:b'wGOWzhzZaeG/abe0+DoepQ==' sha1_base64_bytes = base64.b64encode(sha1_bin_bytes) return sha1_base64_bytes # 如果输出16进制的字符串str。 else: # 以16进制的字符串返回。如:c06396ce1cd969e1bf69b7b4f83a1ea5 sha1_hex_str = sha1.hexdigest() print(sha1_hex_str) return sha1_hex_str # 对文件内的数据进行md5哈希运算。迭代方式,可以处理大文件 def MD5FileWithName(fileName, out_is_base64_bytes=True, block_size=64 * 1024): '''md5 file with filename (MD5) :param fileName: 文件名 :param out_is_base64_bytes: 输出类型。True返回按照base64编码后的字节流。False返回16进制的字符串 :param block_size: 每次读取文件中的数据量 :return: 按照out_is_base64_bytes的条件返回 ''' with open(fileName, 'rb') as f: md5 = hashlib.md5() while True: data = f.read(block_size) if not data: break md5.update(data) # 如果输出base64编码后的字节流bytes。 if out_is_base64_bytes: # 以二进制的字节流返回。如:b'\xc0c\x96\xce\x1c\xd9i\xe1\xbfi\xb7\xb4\xf8:\x1e\xa5' md5_bin_bytes = md5.digest() # print(md5_bin_bytes) # 将二进制的字节流按照base64规则编码,返回base64的字节流。如:b'wGOWzhzZaeG/abe0+DoepQ==' md5_base64_bytes = base64.b64encode(md5_bin_bytes) return md5_base64_bytes # 如果输出16进制的字符串str。 else: # 以16进制的字符串返回。如:c06396ce1cd969e1bf69b7b4f83a1ea5 md5_hex_str = md5.hexdigest() # print(md5_hex_str) return md5_hex_str if __name__ == '__main__': # # 对文件进行md5哈希 # fileName = "test.txt" # md5_hash = MD5FileWithName(fileName, False) # 返回16进制字符串str。 # # md5_hash = MD5FileWithName(fileName, True) # 返回字节流bytes。 # print(type(md5_hash)) # print(md5_hash) # print("====以下是判断:====") # # # 如果是字节流 # if isinstance(md5_hash, bytes): # print("字节流bytes:%s" % md5_hash) # # 字节流转字符串 # md5_str = bytes.decode(md5_hash) # 字节流bytes转为字符串str # print(type(md5_str)) # print("转为字符串str:%s" % md5_str) # # # 如果是字符串 # else: # print("字符串str: %s" % md5_hash) # print() # 对文件进行sha1哈希 fileName = "test.txt" # sha1_hash = SHA1FileWithName(fileName, False) # 返回16进制字符串str。 sha1_hash = SHA1FileWithName(fileName, True) # 返回字节流bytes。 # # 16进制转为10进制 # print("111111111111") # jz10 = int(sha1_hash, 16) # # 10进制转为2进制 # print(type(jz10)) # print("10进制:%s" % jz10) # jz2 = format(jz10, "b") # print(type(jz2)) # print("2进制:%s" % jz2) # print(type(sha1_hash)) print(sha1_hash) print("====以下是判断:====") # 如果是字节流 if isinstance(sha1_hash, bytes): print("字节流bytes:%s" % sha1_hash) # 字节流转字符串 sha1_str = bytes.decode(sha1_hash) # 字节流bytes转为字符串str print(type(sha1_str)) print("转为字符串str:%s" % sha1_str) # 如果是字符串 else: print("字符串str: %s" % sha1_hash) print()