【发布时间】:2018-12-17 14:14:04
【问题描述】:
我正在浏览 Python hashlib 包文档,并希望对两个哈希对象属性(即 hash.block_size 和 hash.digest_size)进行一些说明。下面是每个属性的定义:
hash.digest_size= "生成的哈希大小,以字节为单位。"hash.block_size = "哈希算法的内部块大小,以字节为单位。"
来源:https://docs.python.org/2/library/hashlib.html
所以我知道hash.digest_size 只是数据在被 hash_object 散列或“消化”后的长度或大小(以字节为单位)。例如,从下面的代码中,通过 SHA256 哈希对象获取字符串“Hello World”的摘要会返回 32 字节(或 256 位)的摘要大小。
import hashlib
hash_object = hashlib.sha256()
hash_object.update(b'Hello World')
hex_dig = hash_object.hexdigest()
print(hex_dig)
>>>a591a6d40bf420404a011733cfb7b190d62c65bf0bcda32b57b277d9ad9f146e
print(hash_object.digest_size)
>>>32
print(hash_object.block_size)
>>>64
print(len(hex_dig))
>>>64
我不明白的是这个hash.block_size 属性。它只是表示散列数据的十六进制表示所需的字符长度吗?完全是另外一回事吗?我不太明白这个属性的定义,所以对此的任何澄清都会非常有帮助和有见地!
【问题讨论】:
-
嗯,哈希通常是通过迭代整个文件来计算的,它以块为单位进行计算(例如每次迭代占用 64 个字节),并且每次更新某个状态(用数字表示大小为
digest_size)。最后返回 digest。 -
@WillemVanOnsem 啊哈明白了,这让一切变得更加清晰。谢谢
-
@WillemVanOnsem
digest_size可以小于状态大小。例如。 SHA-224 和 SHA-384 就是这样。但通常它们是相同的。更现代的散列函数通常对状态进行最终转换以产生摘要,经典的只是输出它们的最终状态。
标签: python python-3.x hashlib