Имя: Пароль:
1C
1С v8
Кто силен в алгоритме CRC-32
0 vde69
 
12.03.12
09:28
есть большей файл (несколько гигов), разово вычисляю CRC (алгоритм блочный по 255 байт), тут все нормально

но есть необходимость изменить 1 байт в файле, мне не хочется заново расчитывать весь гиг, хочу заново расчитать только блок в 255 байт и на основании старой суммы CRC и данных одного блока собрать новую CRC, кто знает возможно-ли это в принцепе?
1 qeos
 
12.03.12
09:33
можно.. например хранить дерево CRC блоков блоков..
как в торентах например
2 Mikeware
 
12.03.12
09:34
Насколько помню, нет
3 vde69
 
12.03.12
09:34
(1) это понятно, но хранить в файле - не кошерно, а в памяти слишком много
4 Maxus43
 
12.03.12
09:36
а расчитывать только после изменения не вариант?
5 qeos
 
12.03.12
09:37
(2) можно хранить не в файле а рядом.. или в файловый поток на нтфс
6 Torquader
 
12.03.12
10:24
Основным свойством CRC является перемешиваемость битов, то есть сложно определить влияние конкретного изменённого бита на результат.
В итоге, конечно, есть возможность вычислять блок CRC до изменения, сохранять этот результат, а потом продолжать вычисление с места, где было сделано изменение.
Но этот фокус возможен, если достоверно известно, в каком месте будет проводиться изменение.
Можно, конечно, сохранять блок расчёта чуть ли не для каждого мегабайта в файле и пересчитывать только те блоки, которые изменились, но это потребует достаточно много места.
7 qeos
 
12.03.12
10:33
(6) почему много места?
допустим ты подсчитываешь CRC блоков по 1МБ.. на файл 4G у тебя получается 4000 CRC значений.. считаешь итоговый CRC по этим значениям..

изменился 1 байт в 15 мегабайте.. пересчитал только егошный CRC и потом итоговой.. и все.
8 K-5
 
12.03.12
10:36
(0) это невозможно
9 Torquader
 
13.03.12
10:58
(7) Считать нужно будет с изменённого участка и до конца файла - выигрыш не такой уж и большой.
Чтобы обнаруживать ошибки, программист должен иметь ум, которому доставляет удовольствие находить изъяны там, где, казалось, царят красота и совершенство. Фредерик Брукс-младший