为什么哈希输出长度固定?

时间:2015-04-13 06:28:15

标签: algorithm hash message-digest

无论输入如何(即MD5>> 128位,SHA-256>> 256位),散列函数总是产生固定长度的输出,但为什么呢?

我知道这是设计师设计它们的方式,但为什么他们设计的输出具有相同的长度? 这样它可以以一致的方式存储吗?更容易比较?不太复杂?

3 个答案:

答案 0 :(得分:4)

因为这就是哈希的定义。请参阅wikipedia

  

哈希函数是可用于映射数字数据的任何函数   任意大小的数字数据固定大小

如果您的问题与有用为什么哈希是固定大小有关,则有多种原因(非详尽列表):

  • 哈希通常将较大(通常是任意大小)的输入编码为较小的大小,通常以有损方式编码,即与压缩函数不同,您无法通过"反转"来重建哈希值的输入。这个过程。
  • 具有固定大小的输出很方便,特别是对于设计用作查找键的哈希值。
  • 您可以预测(预)为哈希值分配存储空间并将其索引到连续的内存段(如阵列)中。
  • 对于"原生字大小"的哈希,例如16,32和64位整数值,你可以做很快的相等和排序比较。
  • 任何使用哈希值的算法都可以使用一组固定大小的操作来生成和处理它们。
  • 您可以预测地将在不同哈希函数中生成的哈希值组合在一起。一个bloom filter
  • 您不需要浪费任何空间来编码哈希值的大小。

确实存在特殊的哈希函数,它们能够生成指定固定长度的输出哈希,例如所谓的sponge functions

答案 1 :(得分:1)

正如您所见,它是standard

您还想要的是标准:

  

某些应用程序可能需要带有消息摘要的哈希函数   长度不同于哈希函数提供的长度   标准。在这种情况下,可以使用截断的消息摘要,   从而应用具有较大消息摘要长度的散列函数   要散列的数据,以及生成的消息摘要   通过选择适当数量的最左边的位来截断。

答案 2 :(得分:1)

通常是因为您希望使用哈希值或其中某些部分来快速存储和查找固定大小的数组中的值。 (例如,这是不可调整大小的哈希表的工作原理。)

为什么使用固定大小的数组而不是其他可扩展的数据结构(如链表或二叉树)?因为访问它们往往在理论上和实际上都很快:假设散列函数是好的并且占用的表条目的比例不是太高,则可以获得O(1)查找(与O(log n)查找树)基于数据结构或列表的O(n)平均值。并且这些访问在实践中很快:在计算散列(通常需要具有低隐藏常量的密钥大小的线性时间)之后,通常只需要一个位移,一个位掩码和一个或两个间接存储器访问到一个连续的(a)在现代CPU上很好地利用缓存和(b)流水线的内存块,因为很少需要指针间接。