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()
