EugeneRoshal
Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Bulat_Ziganshin Цитата: ты можешь рассказать о том как всё хитро в rar устроено? что сделано хорошо, а что можно было сделать ещё лучше. если конечно это не мешает твоим коммерческим интересам | Коммерческим не мешает. Я просто за 4 года с реализации много забыл. Сейчас попробую вспомнить. Все сказанное ниже это про RAR5, не RAR29. Вся recovery record (RR) хранится в конце архива. В начале архива записано смещение до нее, для быстрого поиска, но если она не нашлась по смещению, RAR будет искать ее по всему архиву по сигнатуре. Как ты сам знаешь, там используются 16-битные коды Рида-Соломона по схеме RS(200+n,n), то есть, для 5% RR на 200 блоков данных будет 10 блоков RS кода. Архив делится на эти 200 (или меньше, если архив маленький) блоков целиком, от начала, и до самой RR. Но дальше каждый из этих 10 (рассмотрим 5% RR) блоков RS кода делится на блоки меньшего размера, насколько я помню, 64кб каждый. Каждый такой 64 кб блок имеет свою сигнатуру, защищен своей CRC и хранит в себе CRC остальных 200 64 килобайтных блоков данных и 9 блоков кода из одной линейки с ним. RAR умеет работать с такими отдельными 64кб блоками, которые, по сути, маленькая самостоятельная RR. Можно убить основную сигнатуру RR, можно повредить другие 64 кб блоки в одном из 10 больших блоков кода, RAR все равно попытается найти целые 64 кб блоки и использовать их. Хранить 200 с лишним CRC, причем, по-моему, CRC64, а не CRC32, в каждом 64кб блоке, это, конечно, накладно, но зато убить такую RR сложнее, любой выживший маленький блок идет в дело. Я посчитал такую избыточность приемлемой. При желании можно было хранить 10 копий CRC по одной на большой блок кода. Меньше, чем 10, по-моему вообще нельзя. Тогда стойкость к множественным повреждениям уже будет определяться не RS(210,10), а числом копий CRC. Теряется смысл 10 блоков кода. По мне, лучше как сейчас в RAR. То что контрольной суммой должен быть rolling hash, тот же CRC или другой, ты лучше меня знаешь. Это ускоряет поиск сдвинутых данных. Сейчас подумаю, что еще написать |