我想知道压缩算法是否总是为两组不同的文件生成唯一的输出。
说,我有两个文件A和B,并说我正在为每个文件应用压缩算法(例如像PKZIP - 这可能是任何压缩算法)分别获得A.zip和B.zip。对于A和B的某种组合,A.zip是否可能与二进制级别的B.zip完全相同。如果不可能,我们可以安全地假设压缩等同于保证uniquenes的加密散列?另一方面,如果可能的话,你能否提供一个样本A和B文件以及用于验证这种双重性的压缩算法?
答案 0 :(得分:21)
无损压缩(在ZIP文件中使用)将始终为不同的文件生成不同的输出 - 否则您将无法可靠地恢复原始数据。但是,输出数据可以是任何大小 - 对于某些输入,它将大于原始输入。因此,这通常不是非常有用的哈希,通常需要固定大小的输出。
有损压缩(例如,MP3,JPEG等)可以为不同的输入产生相同的输出 - 因此,您无法恢复原始数据,而是获得类似的东西。因此,pigeonhole principle不是问题,因此您可以保证它会减小输出大小,通常甚至指定所需的输出大小。但是,因为类似但略有不同的输入通常会产生相同的输出,所以这对于散列也没有用,因为散列需要输入中的微小变化才能在输出中产生大的变化。
答案 1 :(得分:14)
这是不可能的。如果压缩文件相同,那么当你解压缩它们时它们怎么能产生不同的结果呢?
答案 2 :(得分:3)
当然,有损压缩可以提供与已经提到的相同的输出。
但我认为一个非常重要的一点是,加密哈希应该很难反转(或通过两个不同的输入重现相同的哈希)。因此,像拉链这样的无损且因此可逆的压缩算法将不适合作为加密哈希。
答案 3 :(得分:2)
让 f 成为压缩算法。如果压缩A
和B
产生相同的文件,则 f(A)= f(B)= C ,对于某些 C 。现在,让 f'成为解压缩算法。然后 f'(f(A))= f'(C)= f'(f(B))。因此, f'将A.zip
和B.zip
解压缩到同一个文件中。
因此, f 是一种毫无价值的压缩算法(因为它不是双射),或者A
和B
实际上是同一个文件。 (当我说毫无价值时,我的意思是对无损压缩毫无价值!)
关于您的其他问题,请注意无损压缩算法根据定义不作为散列算法,因为散列函数 h 映射域 A < / em>在(通常)较小的域 B 上。因此 h 不能是一个双射,而我们只是声称我们的无损压缩函数 f 是一个双射。< / p>
答案 4 :(得分:1)
应该是显而易见的:如果压缩文件是相同的,那么解压缩器怎么知道是否要用它来制作A或B?
这不会产生可用的哈希,因为长度是可变的。
答案 5 :(得分:1)
压缩函数必须是单射的,也就是说,每个输入都映射到唯一的输出。如果不是这样,算法将如何知道是否将其解压缩回A或B?
请注意,这仅适用于无损(数据)压缩。例如,可以压缩2张图像并获得相同的结果,但前提是图像非常接近。
答案 6 :(得分:1)
好吧,你的问题有点笼统,但是既然你指出了基于文件的压缩算法(你的pkzip标签就是一件事),那就没有。两种不同的无损压缩算法无法从不同的输入产生相同的输出。
然而,对于有损压缩算法,如JPEG,那么肯定,这当然是可能的,但随后文件将几乎完全相同。
例如,取一个.PNG文件,将其保存为.JPEG,更改一个像素使其在其中一个通道中亮1度或更暗,将其重新保存为.JPEG,并且您有机会获得两个相同的文件,即使输入不同,虽然略有不同。
所以无损算法,不,这是不可能发生的。对于有损算法,是的。
答案 7 :(得分:1)
加密哈希函数有一个非常具体的要求:使其反转非常困难。根据定义,压缩很容易被反转,因此对于加密哈希来说,它是一个非常糟糕的选择。
修改强>
请注意,当我在上面说“按定义”时,我指的是传统定义。严格地说,MD5,SHA-1等也可以被认为是压缩算法。
答案 8 :(得分:0)
只能使用lossy compression算法(与lossless data compression相反)。从理论上讲,它们可以为类似(但仍然不同)的输入数据提供相同的结果。
答案 9 :(得分:0)
对于算法是一个不错的加密哈希值,输入中的一个小的局部变化应该会导致输出中的大的分散变化。此外,散列函数是从任意大小的输入到固定大小输出的映射。