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'xc0cx96xcex1cxd9ixe1xbfixb7xb4xf8:x1exa5'
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'xc0cx96xcex1cxd9ixe1xbfixb7xb4xf8:x1exa5'
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()