hashlib

1、功能

Secure hash and message digest algorithms.

2、hashlib的方法

查看hashilib的方法:

>>> import hashlib
>>> dir(hashlib)
['__all__', '__builtin_constructor_cache', '__builtins__', '__cached__', '__doc__', '__file__', '__get_builtin_constructor', '__loader__', '__name__', '__package__', '__spec__', '_hashlib', 'algorithms_available', 'algorithms_guaranteed', 'blake2b', 'blake2s', 'md5', 'new', 'pbkdf2_hmac', 'sha1', 'sha224', 'sha256', 'sha384', 'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'sha512', 'shake_128', 'shake_256']
>>>

3、计算字符串md5值

  • 首先实例化md5
>>> md5 = hashlib.md5()

如果要用其他的,比如sha256之类的也就只需要md5=hashlib.sha256() 来实例化md5即可。

  • 使用md5.update(b’string’)更新md5,必须是二进制进行计算
  • 最后用md5.hexdigest()来得到md5值
>>> md5.update(b'huangyisan')
>>> md5.hexdigest()
'1b4ae8b712bd84499feb814954393eb2'

此时如果想继续算某个字符串的md5,不能直接md5.update(b’string’),因为刚才的计算已经污染了,需要重新实例化md5才可以。

上面得到了错误的结果,上面的结果是对huangyisanhuangdou进行了求md5值

修改后的代码如下:

# 重新实例化md5
>>> md5=hashlib.md5()
>>> md5.update('huangdou'.encode())
>>> md5.hexdigest()
'3742e5f15192d17f1d1c57b16187d04f'

4、一个能计算文件或字符串的md5函数

要考虑字符串可能是数字,字符,或者是二进制流

  • 可以把这些类型除了二进制的都转换为字符串,然后再都转换成二进制(主要是处理数字的情况),因为update(‘’)必须是二进制。
  • 因为要转换,所以要判断是否是二进制或者非二进制。
  • 可以通过``type()``去比较,或者用``isinstance()``去判断。

type()和isinstance()代码示例:

>>> type(b'huan') == type(b'')
True
>>> isinstance('huang',bytes)
False

当对文本进行md5的时候,则需要指定读多少大小,然后判断是否读完,同时还需要判断输入的文件是否存在。

判断文件是否存在,可以用 os.path.exists 方法。 代码示例:

>>> os.path.exists('/Users/huangyisan/Desktop/qmtv/front-2.0/vhosts/map.conf')
True

函数如下:

import os
import hashlib

# 定义size大小
SIZE = 1024 * 1024 * 1024

def md5_string(string):
    # 判断string类型
    if not isinstance(string, bytes):
        string = str(string).encode()
    md5 = hashlib.md5()
    md5.update(string)
    return md5.hexdigest()

def md5_file(path):
    # 判断文件是否存在
    if os.path.exists(path):
        md5 = hashlib.md5()
        fhandler = open(path, 'rb')
        while True:
            cxt = fhandler.read(SIZE)
            # 判断文件是否读完
            if not cxt:
                break
            md5.update(cxt)

        fhandler.close()
        return md5.hexdigest()
    return '文件不存在'

if __name__ == '__main__':
    print(md5_string(1))
    print(md5_string('huangyisan'))
    print(md5_string(b'huangdou'))
    print(md5_file('/Users/huangyisan/Desktop/qmtv/front-2.0/vhosts/map.conf'))

执行得到的结果为:

c4ca4238a0b923820dcc509a6f75849b
1b4ae8b712bd84499feb814954393eb2
3742e5f15192d17f1d1c57b16187d04f
9a571941cba0cd94d62bca883765427f