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

posted @ 2020-06-10 19:35  安迪9468  阅读(1465)  评论(1编辑  收藏  举报