hashlib 中`block_size` 和`digest_size` 的区别?
Difference between `block_size` and `digest_size` in hashlib?
我正在浏览 Python hashlib
包文档并希望对两个散列对象属性(即 hash.block_size
和 hash.digest_size
)进行一些澄清。下面是每个属性的定义:
hash.digest_size
="The size of the resulting hash in bytes."
hash.block_size
= "The internal block size of the hash algorithm in bytes."
来源:https://docs.python.org/2/library/hashlib.html
所以我明白 hash.digest_size
只是数据被散列后的长度或大小(以字节为单位)或 "digested" 被 hash_object。例如,从下面的代码中,通过 SHA256 哈希对象 returns 获取字符串 'Hello World' 的摘要 digest_size 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
属性。它只是表示哈希数据的十六进制表示所需的字符长度吗?这完全是另一回事吗?我不太明白这个属性的定义,所以对此的任何澄清都会非常有帮助和有见地!
哈希是用输入的任意长度数据计算的。大多数散列函数通过使用基于固定数据块更新内部状态的函数来执行此操作,并且您正在散列的文件(例如)以该固定块大小的块进行处理。
因此大多数哈希函数都有一个固定的初始状态(通常为 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
。
我正在浏览 Python hashlib
包文档并希望对两个散列对象属性(即 hash.block_size
和 hash.digest_size
)进行一些澄清。下面是每个属性的定义:
hash.digest_size
="The size of the resulting hash in bytes."
hash.block_size
= "The internal block size of the hash algorithm in bytes."
来源:https://docs.python.org/2/library/hashlib.html
所以我明白 hash.digest_size
只是数据被散列后的长度或大小(以字节为单位)或 "digested" 被 hash_object。例如,从下面的代码中,通过 SHA256 哈希对象 returns 获取字符串 'Hello World' 的摘要 digest_size 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
属性。它只是表示哈希数据的十六进制表示所需的字符长度吗?这完全是另一回事吗?我不太明白这个属性的定义,所以对此的任何澄清都会非常有帮助和有见地!
哈希是用输入的任意长度数据计算的。大多数散列函数通过使用基于固定数据块更新内部状态的函数来执行此操作,并且您正在散列的文件(例如)以该固定块大小的块进行处理。
因此大多数哈希函数都有一个固定的初始状态(通常为 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
。