为什么哈希输出的长度是固定的?
why is hash output fixed in length?
无论输入如何,哈希函数总是产生固定长度的输出(即 MD5 >> 128 位,SHA-256 >> 256 位),但为什么呢?
我知道设计师是这样设计的,但为什么他们设计的输出长度相同?
这样它就可以以一致的方式存储?比较容易?没那么复杂?
因为这就是散列的定义。参考wikipedia
A hash function is any function that can be used to map digital data
of arbitrary size to digital data of fixed size.
如果您的问题涉及为什么固定大小的散列有用,则有多种原因(非详尽列表):
- 哈希通常将较大(通常是任意大小)的输入编码成较小的大小,通常以有损方式进行,即与压缩函数不同,您无法通过 "reversing" 过程从哈希值重建输入。
- 具有固定大小的输出很方便,特别是对于设计用作查找键的哈希。
- 您可以预见性地(预先)为散列值分配存储空间,并将它们索引到连续的内存段(例如数组)中。
- 对于 "native word sizes" 的散列,例如16、32 和 64 位整数值,您可以进行非常快速的相等和排序比较。
- 任何使用哈希值的算法都可以使用一组固定大小的操作来生成和处理它们。
- 您可以预见性地组合使用不同散列函数生成的散列,例如bloom filter.
- 你不需要浪费任何space来编码哈希值有多大。
确实存在特殊的散列函数,能够产生指定固定长度的输出散列,例如所谓的sponge functions。
如您所见,它是 standard。
标准中也有你想要的:
Some application may require a hash function with a message digest
length different than those provided by the hash functions in this
Standard. In such cases, a truncated message digest may be used,
whereby a hash function with a larger message digest length is applied
to the data to be hashed, and the resulting message digest is
truncated by selecting an appropriate number of the leftmost bits.
通常是因为您想使用散列值或散列值的一部分来快速存储和查找固定大小数组中的值。 (例如,这就是不可调整大小的散列 table 的工作原理。)
为什么要使用固定大小的数组而不是其他一些可增长的数据结构(如链表或二叉树)?因为访问它们往往在理论上和实践上都很快:假设散列函数很好并且占用的 table 条目的比例不太高,你会得到 O(1) 查找(相对于 O(log n ) 平均查找基于树的数据结构或 O(n) 查找列表)。这些访问在实践中很快:在计算散列后,通常需要线性时间在具有低隐藏常量的密钥的大小上,通常只有一个位移位,一个位掩码和一个或两个间接内存访问到一个连续的(a) 充分利用缓存和 (b) 在现代 CPU 上很好地使用管道的内存块,因为需要很少的指针间接寻址。
无论输入如何,哈希函数总是产生固定长度的输出(即 MD5 >> 128 位,SHA-256 >> 256 位),但为什么呢?
我知道设计师是这样设计的,但为什么他们设计的输出长度相同? 这样它就可以以一致的方式存储?比较容易?没那么复杂?
因为这就是散列的定义。参考wikipedia
A hash function is any function that can be used to map digital data of arbitrary size to digital data of fixed size.
如果您的问题涉及为什么固定大小的散列有用,则有多种原因(非详尽列表):
- 哈希通常将较大(通常是任意大小)的输入编码成较小的大小,通常以有损方式进行,即与压缩函数不同,您无法通过 "reversing" 过程从哈希值重建输入。
- 具有固定大小的输出很方便,特别是对于设计用作查找键的哈希。
- 您可以预见性地(预先)为散列值分配存储空间,并将它们索引到连续的内存段(例如数组)中。
- 对于 "native word sizes" 的散列,例如16、32 和 64 位整数值,您可以进行非常快速的相等和排序比较。
- 任何使用哈希值的算法都可以使用一组固定大小的操作来生成和处理它们。
- 您可以预见性地组合使用不同散列函数生成的散列,例如bloom filter.
- 你不需要浪费任何space来编码哈希值有多大。
确实存在特殊的散列函数,能够产生指定固定长度的输出散列,例如所谓的sponge functions。
如您所见,它是 standard。
标准中也有你想要的:
Some application may require a hash function with a message digest length different than those provided by the hash functions in this Standard. In such cases, a truncated message digest may be used, whereby a hash function with a larger message digest length is applied to the data to be hashed, and the resulting message digest is truncated by selecting an appropriate number of the leftmost bits.
通常是因为您想使用散列值或散列值的一部分来快速存储和查找固定大小数组中的值。 (例如,这就是不可调整大小的散列 table 的工作原理。)
为什么要使用固定大小的数组而不是其他一些可增长的数据结构(如链表或二叉树)?因为访问它们往往在理论上和实践上都很快:假设散列函数很好并且占用的 table 条目的比例不太高,你会得到 O(1) 查找(相对于 O(log n ) 平均查找基于树的数据结构或 O(n) 查找列表)。这些访问在实践中很快:在计算散列后,通常需要线性时间在具有低隐藏常量的密钥的大小上,通常只有一个位移位,一个位掩码和一个或两个间接内存访问到一个连续的(a) 充分利用缓存和 (b) 在现代 CPU 上很好地使用管道的内存块,因为需要很少的指针间接寻址。