【问题标题】:How best to split a file into N parts with M redundant parts such that any N of the N+M parts is sufficient to reconstuct it?如何最好地将文件拆分为具有 M 个冗余部分的 N 个部分,以便 N+M 个部分中的任何 N 个足以重建它?
【发布时间】:2017-01-20 23:47:41
【问题描述】:

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

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

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

我发现 1989 Rabin 算法似乎可以做到这一点。想知道是否有人知道更好/更快的东西?

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

【问题讨论】:

标签: algorithm channel redundancy


【解决方案1】:

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

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

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

请注意,raptor 代码并不完全可靠——有时您可能需要收集一个额外的块——但对于它们支持的用例来说,这对于线性时间解码来说是一个很小的代价。

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

【讨论】:

  • 所以这个链接:blog.notdot.net/2012/01/Damn-Cool-Algorithms-Fountain-Codes 提供了一个很好的高级概述,即使我能理解。他们是公共领域的猛禽算法吗?还是我应该坚持那里描述的 LT 代码并避免踩到任何专利?性能不是我最关心的问题,因为在我的应用程序中使用可能是每天而不是每分钟。
  • RaptorQ 是 IETF 标准 raptor 代码,如今在许多地方都使用:tools.ietf.org/html/rfc6330。周围有很多免费的实现,比如openrq-team.github.io/openrqopenrq-team.github.io/openrq
  • 谢谢!我现在正在查看链接。在我理想化的应用程序中,我能够将 1GB 流处理为 (32) 个 32mb 块,外加至少 8 个备用块。当然,喷泉编码使备用计数变得微不足道,事实上,我的最终用户可以指定他们愿意支付的传输和端点存储成本。虽然这很容易通过 F、Z 和 N 字段(传输长度(32mb + 标头)、源块数(32)、子块数(40))来满足,但我担心 T - 符号大小,哪个似乎限制为 64kb?我读对了吗?
  • 嗯,看起来我每个块可以有 512 个符号,但不建议这样做,以实现我的 32mb 块大小(使用忽略数据包头的圆形数学)。
  • 您可以在该 1GB 流的每个片段中放置任意数量的块。
猜你喜欢
  • 2015-11-15
  • 2011-03-12
  • 2013-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多