math - 仅使用校验和传输文件?

标签 math checksum

是否可以仅使用校验和系统传输大文件,然后通过计算重建原始文件?

假设您传输文件的 MD5 校验和和文件的大小。通过制作“虚拟文件”并计算其校验和,尝试每一个位组合,您最终应该“到达”原始文件。但是在此过程中,您还会遇到很多校验和也匹配的“冲突”。

因此,我们将原始文件的第一个字节更改为某个指定值,再次计算校验和,并将其也发送出去。如果我们在虚拟文件中进行相同的替换,我们可以测试每个“碰撞”以查看它是否仍然匹配。这应该缩小一点范围,我们可以这样做几次。

当然,这样做的计算能力将是巨大的。但是理论上是否可行,您需要多少校验和才能传输某些内容(例如 1mb)?或者也许传输校验和所需的数据量几乎与文件一样大,使其毫无意义?

最佳答案

您需要传输的数据量肯定与文件大小相同。想一想:如果你能传达一个 n带有 n-1 的字节文件字节的数据,这意味着你有 256^(n-1)您可能已发送的数据的可能模式,但正在从大小为 256^n 的空间中进行选择.这意味着每 256 个文件中就有一个不能使用这种方法表达——这通常被称为 pidegonhole principle .

现在,即使这不是问题,也不能保证在任何给定数量的校验和之后您不会发生冲突。校验和算法旨在避免冲突,但对于大多数校验和/散列算法,没有强有力的证据表明在 X 散列之后您可以保证在 N 字节空间中没有冲突。

最后,至少,哈希算法被设计为难以逆转,因此即使有可能,也需要大量的 CPU 能力才能做到这一点。

也就是说,对于类似的方法,您可能有兴趣阅读 Forward Error Correction codes - 它们根本不是哈希算法,但我认为您可能会发现它们很有趣。

关于math - 仅使用校验和传输文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4759122/

相关文章:

linux - 校验和远程文件

java - Java Socket BufferedReader 是否需要校验和来检查数据?

c++ - C fmod 函数 : Floating point error and optimization

database - 如何将数学表达式/解释存储到数据库中

passport.js - 为什么现代 Passport 的机器可读区域中的复合校验位没有考虑所有数据?

objective-c - 如何在 Objective C 中计算 CheckSum

javascript - 找到适合网格系统的所有矩形

math - 计算环绕平面上两点之间的(线的)角度

c# - 使用 BigInteger 的阿特金筛法的质数

c - Alpine APK 包存储库,校验和是如何计算的?