Java Deflater, тот же результат сейчас и в будущем (детерминированный)

#java #compression #zlib #deterministic

#java #сжатие #zlib #детерминированный

Вопрос:

Я написал программу резервного копирования, используя Deflater и SHA-1 для хранения файлов и хэш-значения. Я вижу, что Deflater Java использует zlib. Если я явно задам уровень Deflater, могу ли я ожидать, что всегда буду получать одну и ту же серию байтов независимо от платформы и версии JRE?

Если нет, то что мне использовать? Существуют ли какие-либо стабильные и быстрые реализации на чистом Java?

Ответ №1:

Выполните SHA-1 перед сжатием. Затем вы также проверяете правильность сжатия и распаковки.

Нет гарантии, что то, что компрессор выдает сегодня, будет таким же, как то, что более поздняя версия компрессора выдает завтра для того же ввода. И такой гарантии быть не должно, поскольку это исключило бы улучшения в сжатии.

Единственная гарантия заключается в том, что процесс сжатия-распаковки выполняется без потерь, так что вы получаете от декомпрессора именно то, что вы передали компрессору. По этой причине вам необходимо вычислить сигнатуры на входе компрессора и на выходе декомпрессора. Игнорируйте промежуточный сжатый поток.