| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- """
- 哈希摘要 - 数字签名/指纹 - 单向哈希函数(没有反函数不可逆)
- 应用领域:
- 1. 数据库中的用户敏感信息保存成哈希摘要
- 2. 给数据生成签名验证数据没有被恶意篡改
- 3. 云存储服务的秒传功能(去重功能)
- """
- class StreamHasher():
- """摘要生成器"""
- def __init__(self, algorithm='md5', size=4096):
- """初始化方法
- @params:
- algorithm - 哈希摘要算法
- size - 每次读取数据的大小
- """
- self.size = size
- cls = getattr(__import__('hashlib'), algorithm.lower())
- self.hasher = cls()
-
- def digest(self, file_stream):
- """生成十六进制的摘要字符串"""
- # data = file_stream.read(self.size)
- # while data:
- # self.hasher.update(data)
- # data = file_stream.read(self.size)
- for data in iter(lambda: file_stream.read(self.size), b''):
- self.hasher.update(data)
- return self.hasher.hexdigest()
- def __call__(self, file_stream):
- return self.digest(file_stream)
- def main():
- """主函数"""
- hasher1 = StreamHasher()
- hasher2 = StreamHasher('sha1')
- hasher3 = StreamHasher('sha256')
- with open('Python-3.7.2.tar.xz', 'rb') as file_stream:
- print(hasher1.digest(file_stream))
- file_stream.seek(0, 0)
- print(hasher2.digest(file_stream))
- file_stream.seek(0, 0)
- print(hasher3(file_stream))
- if __name__ == '__main__':
- main()
|