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