есть большей файл (несколько гигов), разово вычисляю CRC (алгоритм блочный по 255 байт), тут все нормально
но есть необходимость изменить 1 байт в файле, мне не хочется заново расчитывать весь гиг, хочу заново расчитать только блок в 255 байт и на основании старой суммы CRC и данных одного блока собрать новую CRC, кто знает возможно-ли это в принцепе?
Основным свойством CRC является перемешиваемость битов, то есть сложно определить влияние конкретного изменённого бита на результат.
В итоге, конечно, есть возможность вычислять блок CRC до изменения, сохранять этот результат, а потом продолжать вычисление с места, где было сделано изменение.
Но этот фокус возможен, если достоверно известно, в каком месте будет проводиться изменение.
Можно, конечно, сохранять блок расчёта чуть ли не для каждого мегабайта в файле и пересчитывать только те блоки, которые изменились, но это потребует достаточно много места.
(6) почему много места?
допустим ты подсчитываешь CRC блоков по 1МБ.. на файл 4G у тебя получается 4000 CRC значений.. считаешь итоговый CRC по этим значениям..
изменился 1 байт в 15 мегабайте.. пересчитал только егошный CRC и потом итоговой.. и все.
(7) Считать нужно будет с изменённого участка и до конца файла - выигрыш не такой уж и большой.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший