转自:https://zhuanlan.zhihu.com/p/168608305

    1. # Python计算字符串或文件的MD5/SHA值
    2. import time
    3. import os
    4. import hashlib
    5. # 计算文件的MD5/SHA值
    6. def file(path, algorithm):
    7. global start, end # 声明全局变量
    8. start = time.time() # 获取当前时间,用于记录计算过程的耗时
    9. size = os.path.getsize(path) # 获取文件大小,单位是字节(byte)
    10. with open(path, 'rb') as f: # 以二进制模式读取文件
    11. while size >= 1024 * 1024: # 当文件大于1MB时将文件分块读取
    12. algorithm.update(f.read(1024 * 1024))
    13. size -= 1024 * 1024
    14. algorithm.update(f.read())
    15. end = time.time() # 获取计算结束后的时间
    16. print()
    17. print(algorithm.hexdigest()) # 输出计算结果
    18. # 计算字符串的MD5/SHA值
    19. def str(text, algorithm):
    20. global start, end
    21. start = time.time()
    22. algorithm.update(text.encode(encoding='UTF-8'))
    23. end = time.time()
    24. print()
    25. print(algorithm.hexdigest())
    26. print('https://blog.zeruns.tech')
    27. print('1.MD5 2.SHA1 3.SHA224 4.SHA256 5.SHA384 6.SHA512')
    28. flag1 = int(input('请选择算法:'))
    29. print('\n1.文件 2.字符串')
    30. flag2 = int(input('请选择要计算的是文件还是字符串:'))
    31. if flag2 == 1:
    32. path = input('\n请输入要计算的文件的目录(若跟脚本同目录直接输入文件名即可):')
    33. if flag1 == 1:
    34. file(path, hashlib.md5())
    35. elif flag1 == 2:
    36. file(path, hashlib.sha1())
    37. elif flag1 == 3:
    38. file(path, hashlib.sha224())
    39. elif flag1 == 4:
    40. file(path, hashlib.sha256())
    41. elif flag1 == 5:
    42. file(path, hashlib.sha384())
    43. elif flag1 == 6:
    44. file(path, hashlib.sha512())
    45. elif flag2 == 2:
    46. text = input('\n请输入要加密的字符串:')
    47. if flag1 == 1:
    48. str(text, hashlib.md5())
    49. elif flag1 == 2:
    50. str(text, hashlib.sha1())
    51. elif flag1 == 3:
    52. str(text, hashlib.sha224())
    53. elif flag1 == 4:
    54. str(text, hashlib.sha256())
    55. elif flag1 == 5:
    56. str(text, hashlib.sha384())
    57. elif flag1 == 6:
    58. str(text, hashlib.sha512())
    59. print("\n计算耗时: %s seconds" % (end - start))