如何最好地将文件拆分为具有M个冗余部分的N个部分,使得任何N个N + M部分足以重新构建它?

时间:2017-01-20 23:47:41

标签: algorithm channel redundancy

寻找获取文件的最佳算法,将其拆分为N个部分,添加M个冗余部分,然后将文件存储在N + M个不同的位置。文件通常很大。

例如:1GB文件可分为(32)32MB部分,计算(8)额外32MB部分,1.25GB冗余结构存储在40个不同区域。目标是从任何(32)有效部分重新创建文件。原始(32)部分的独立散列可用于完整性检查正确的重建。

如果这是可行的,我相信这会提供相当于8个镜像副本的功能,开销只有25%(加上计算时间),不是吗?

我发现1989年的Rabin算法似乎是这样做的。想知道是否有人知道更好/更快的事情吗?

我认识到这与Raid 5和Raid 6的工作方式类似 - 希望采用这种方法,将其扩展到8个以上的奇偶校验块,并在文件级执行它。

1 个答案:

答案 0 :(得分:1)

您定义问题的方式确实称为秘密共享,但自1989年以来已经有所改进 - 我们不再需要提前指定M.

现在,您可以为文件生成基本上无限的块序列,并从任何集合中重新生成文件,只要它们的长度加起来与原始文件的长度相同。 / p>

它被称为“喷泉代码”:https://en.wikipedia.org/wiki/Fountain_code。今天的“猛禽代码”是最好的,我相信:https://en.wikipedia.org/wiki/Raptor_code。他们是第一个提供线性时间编码和解码的人。

请注意,猛禽代码并不完全可靠 - 偶尔您可能需要收集一个额外的块 - 但对于他们支持的用例,这是为线性时间解码付出的小代价。

如果您需要绝对确定可以在给定最少数量的块的情况下解码消息,那么我发现使用中国剩余定理进行秘密共享(此处描述:https://en.wikipedia.org/wiki/Secret_sharing#Using_the_Chinese_remainder_theorem),但使用不可减少的GF(2 ^ N)中的多项式代替素数整数,很容易扩展到喷泉代码,但需要时间(N ^ 2)进行编码和解码。