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

  

參考:https://www.cnblogs.com/lilyxiaoyy/p/10942922.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM