example05.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """
  2. 设计模式 - 策略模式(指定的策略不同执行的算法不同)
  3. """
  4. from hashlib import md5
  5. from hashlib import sha1
  6. from hashlib import sha256
  7. from hashlib import sha512
  8. class StreamHasher():
  9. """哈希摘要生成器"""
  10. def __init__(self, algorithm='md5', size=1024):
  11. self.size = size
  12. alg = algorithm.lower()
  13. if alg == 'md5':
  14. self.hasher = md5()
  15. elif alg == 'sha1':
  16. self.hasher = sha1()
  17. elif alg == 'sha256':
  18. self.hasher = sha256()
  19. elif alg == 'sha512':
  20. self.hasher = sha512()
  21. else:
  22. raise ValueError('不支持指定的摘要算法')
  23. # 魔法方法: 让对象可以像函数一样被调用
  24. def __call__(self, stream):
  25. return self.to_digest(stream)
  26. def to_digest(self, stream):
  27. """生成十六进制形式的哈希摘要字符串"""
  28. for data in iter(lambda: stream.read(self.size), b''):
  29. self.hasher.update(data)
  30. return self.hasher.hexdigest()
  31. def main():
  32. """主函数"""
  33. hasher = StreamHasher('sha1', 4096)
  34. with open('Python语言规范.pdf', 'rb') as stream:
  35. # print(hasher.to_digest(stream))
  36. print(hasher(stream))
  37. if __name__ == '__main__':
  38. main()