example07.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """
  2. 哈希摘要 - 数字签名/指纹 - 单向哈希函数(没有反函数不可逆)
  3. 应用领域:
  4. 1. 数据库中的用户敏感信息保存成哈希摘要
  5. 2. 给数据生成签名验证数据没有被恶意篡改
  6. 3. 云存储服务的秒传功能(去重功能)
  7. """
  8. class StreamHasher():
  9. """摘要生成器"""
  10. def __init__(self, algorithm='md5', size=4096):
  11. """初始化方法
  12. @params:
  13. algorithm - 哈希摘要算法
  14. size - 每次读取数据的大小
  15. """
  16. self.size = size
  17. cls = getattr(__import__('hashlib'), algorithm.lower())
  18. self.hasher = cls()
  19. def digest(self, file_stream):
  20. """生成十六进制的摘要字符串"""
  21. # data = file_stream.read(self.size)
  22. # while data:
  23. # self.hasher.update(data)
  24. # data = file_stream.read(self.size)
  25. for data in iter(lambda: file_stream.read(self.size), b''):
  26. self.hasher.update(data)
  27. return self.hasher.hexdigest()
  28. def __call__(self, file_stream):
  29. return self.digest(file_stream)
  30. def main():
  31. """主函数"""
  32. hasher1 = StreamHasher()
  33. hasher2 = StreamHasher('sha1')
  34. hasher3 = StreamHasher('sha256')
  35. with open('Python-3.7.2.tar.xz', 'rb') as file_stream:
  36. print(hasher1.digest(file_stream))
  37. file_stream.seek(0, 0)
  38. print(hasher2.digest(file_stream))
  39. file_stream.seek(0, 0)
  40. print(hasher3(file_stream))
  41. if __name__ == '__main__':
  42. main()