#java #compression #zlib #deterministic
#java #сжатие #zlib #детерминированный
Вопрос:
Я написал программу резервного копирования, используя Deflater и SHA-1 для хранения файлов и хэш-значения. Я вижу, что Deflater Java использует zlib. Если я явно задам уровень Deflater, могу ли я ожидать, что всегда буду получать одну и ту же серию байтов независимо от платформы и версии JRE?
Если нет, то что мне использовать? Существуют ли какие-либо стабильные и быстрые реализации на чистом Java?
Ответ №1:
Выполните SHA-1 перед сжатием. Затем вы также проверяете правильность сжатия и распаковки.
Нет гарантии, что то, что компрессор выдает сегодня, будет таким же, как то, что более поздняя версия компрессора выдает завтра для того же ввода. И такой гарантии быть не должно, поскольку это исключило бы улучшения в сжатии.
Единственная гарантия заключается в том, что процесс сжатия-распаковки выполняется без потерь, так что вы получаете от декомпрессора именно то, что вы передали компрессору. По этой причине вам необходимо вычислить сигнатуры на входе компрессора и на выходе декомпрессора. Игнорируйте промежуточный сжатый поток.