我正在阅读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位)的digest_size。
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
属性。它仅仅是表示散列数据的十六进制表示形式所需的字符长度吗?还有其他事情吗?我对该属性的定义不太了解,因此对此进行任何澄清将非常有帮助且有见地!
答案 0 :(得分:2)
使用输入的任意长度数据计算哈希。大多数散列函数通过使用基于固定数据块更新内部状态的函数来实现此目的,并且您要散列的文件(例如)将以此固定块大小的块进行处理。
因此,大多数散列函数具有固定的初始状态(通常为digest_size
,但有时更大),该状态在初始化函数(或具有空输入的散列的构造函数)中进行初始化。对于SHA-256(以及SHA-224),这是32个字节,或者实际上是8个整数。
然后,它按块处理输入数据(对于SHA-256,这是64个字节,将其转换为16个32位整数,然后对8个状态整数和16个数据整数进行冗长的计算,之后我们得到一个新的状态为8个整数。只要有输入数据,该状态就会持续下去。输入块的大小为block_size
。
当我们要计算摘要时(通常在数据末尾),我们填充最后一个数据(如果最后一个输入块小于块大小),并将到目前为止的总哈希长度放入最终值64个字节(16个整数),并从最后一次开始进行转换。摘要功能然后输出最终状态(的一部分)(SHA-224仅输出其32字节状态的224位= 28字节)作为摘要。最终输出的大小(以字节为单位)为digest_size
。