2017-01-20 11 views
1

Ищите лучший алгоритм для взятия файла, разбивайте его на N частей, добавьте части M избыточности и затем сохраните файл в N + M разных местах. Обычно файлы будут большими.Как лучше всего разбить файл на N частей с M избыточными частями, так что любой N из N + M частей достаточно, чтобы восстановить его?

Например: 1GB-файл можно разделить на 32-разрядные части (32), иметь (8) дополнительные 32MB части, а избыточную структуру 1.25GB хранить на 40 различных участках. Целью было бы воссоздать файл из любых (32) действительных частей. Независимый хеш оригинальной (32) части будет доступен для проверки правильности правильной реконструкции.

Если это выполнимо, я считаю, что это обеспечит функциональный эквивалент наличия 8 зеркальных копий для накладных расходов всего на 25% (плюс время вычисления), не так ли?

Я нашел алгоритм Рабина 1989 года, который, как представляется, делает это. Интересно, знал ли кто-нибудь о чем-то лучше/быстрее?

Я признаю, что это похоже на то, как работают Raid 5 и Raid 6 - ища такой подход, расширить его до 8 + блоков четности и выполнить его на уровне файла.

+0

Похоже, вы говорите о [секретном обмене] (https://en.wikipedia.org/wiki/Secret_sharing), я думаю, вы имели в виду алгоритм Рабина? Есть ли что-то, что заставляет вас поверить, что кто-то улучшил это? – jthill

+0

Вы ссылаетесь на эту статью? http://web.engr.oregonstate.edu/~yavuza/Courses/Fall2014_AdvNetSec/ResearchPapers/RegularPapers/IDA.pdf –

+0

http://stackoverflow.com/questions/252555/how-does-cauchy-reed-solomon-algorithm работа кажется актуальной. – rici

ответ

1

То, как вы определили проблему, действительно называется секретным совместным использованием, но с 1989 года были сделаны улучшения - нам больше не нужно указывать M заранее.

Теперь вы можете создать практически безграничную последовательность блоков для файла и регенерировать файл с любой из них, если их длины составляют длину исходного файла.

Это называется «фонтанным кодом»: 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) для кодирования и декодирования.

+0

Спасибо, прочитав эти ссылки сейчас. – Cassey

+0

Итак, эта ссылка: http://blog.notdot.net/2012/01/Damn-Cool-Algorithms-Fountain-Codes обеспечивает хороший обзор на высоком уровне, даже я мог бы понять. Являются ли их алгоритмы злоумышленника общедоступным доменом? Или я должен придерживаться описанного там кода LT и избегать доступа к каким-либо патентам? Производительность не является моей главной задачей, поскольку использование в моем приложении может выполняться ежедневно, а не поминутно. – Cassey

+0

RaptorQ - стандартный код Raptor IETF, который используется во многих местах в наши дни: https: //tools.ietf.org/html/rfc6330. Существует множество бесплатных реализаций, например http://openrq-team.github.io/openrq/ и http://openrq-team.github.io/openrq/ –