Advertisement

python应用之内置hashlib库的哈希算法介绍

阅读量:

hashlib 是 Python 的一个内置模块,提供了像 SHA1, SHA256, MD5 等哈希算法。可以接受任意长度的字节数据作为输入,并输出一个固定长度的“哈希值”,通常用于校验数据的完整性。而且该算法是不可逆的,不能通过哈希值反算出原始数据。

使用 hashlib

要使用 hashlib 模块,直接导入它即可。然后通过new方法或者sha256方法等创建一个哈希对象,通过调用该对象的update() 方法来提供要哈希的数据(update方法支持分批提供数据),最后通过调用 hexdigest() 方法来获取十六进制格式的哈希值字符串,或者digest方法获取字节串

常用方法介绍

  • new(name,data=b’’)方法:创建一个hash算法对象,name传入的是算法的名字,比如下面中的算法名字,data传入的是原始字节数据,可以默认为空。

('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512','blake2b', 'blake2s',
'sha3_224', 'sha3_256', 'sha3_384', 'sha3_512', 'shake_128', 'shake_256')

  • 算法名字对应的方法:比如sha256(),md5()等,功能同new方法,可传入字节bytes,字节数组bytearray和内存视图对象memoryview。

  • update(data)方法:向哈希对象中添加数据(字节数据)。可以多次调用此方法,每次调用都会将提供的数据添加到当前哈希计算中。多次调用 update() 方法等同于一次性调用 update() 并传入所有数据的计算结果。

  • digest():返回当前哈希对象计算得到的哈希值,结果为字节串(bytes)。

  • hexdigest():与 digest() 方法类似,返回的是十六进制格式的哈希值字符串,而不是字节串。

  • copy()方法:返回当前哈希对象的一个浅拷贝。通过复制哈希对象并继续在其上调用 update() 方法,可以避免重复计算初始字符串的哈希值。

示例:使用 SHA-256 算法得到哈希值

复制代码
 import hashlib

    
 #字符串
    
 message = "Hello, world!"
    
  
    
 # 创建一个SHA256对象
    
 hash_ins = hashlib.sha256()
    
 #new方法和sha256方法类似,大家都可使用
    
 #hash_object = hashlib.new('sha256')
    
  
    
 # 提供字节数据
    
 hash_ins.update(message.encode())
    
  
    
 # 获取散列值的十六进制表示
    
 print(f"SHA-256 哈希值: {hash_ins.hexdigest()}")
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/R4K86fqtrF1CjTUNSaHxuIMJnW7z.png)

结果:

SHA-256 哈希值: 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3

示例:校验文件的完整性。

定义一个文件,通过open函数打开文件对象,通过read/readline/readlines函数等得到文件内容,通过update方法计算全部文件内容的哈希值。

复制代码
 file = 'config.txt' #文件内容随意填充

    
 with open(file,'rb') as f:
    
 	hash_ins = hashlib.sha256 ()
    
 	while True:
    
 		#每次读取100字节
    
 		content = f.read(100)
    
 		if content:
    
 			hash_ins.update(content)
    
 		else:
    
 			#当文件读取完毕后,打印最后的哈希值
    
 			print(hash_ins.hexdigest())
    
 			break
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-17/yHzUOr6lgVQPDcNuovdtXnIwk8qT.png)

执行后结果:

f07bd7a28481e1bcf378e673bbe5d03b7f8e5bb5cdc7589e32a8a615dfdc2b20

当我们将文件内容更改一个字符后,我们重新执行,结果变成如下:

1cc02b69147493934d0c94c018ab72cca50744188e23f00bf5155c8fe4f2b1d5

由此可以判定,文件内容已被更新,达到校验文件完整性的目的。

共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

-----指水滴不断地滴,可以滴穿石头;

-----比喻坚持不懈,集细微的力量也能成就难能的功劳。

----感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。

全部评论 (0)

还没有任何评论哟~