Сжатый вывод отличается от перехода на реализацию Ruby - PullRequest
0 голосов
/ 11 октября 2018

Я внедряю программу, которая дефлирует файл в Git BLOB и сохраняет его соответствующим образом.

У меня есть справочная реализация ruby ​​, основанная на статье изgit book

Я пытаюсь реализовать это на ходу здесь

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

vbindiff показывает, что первые 2 байта идентичны (как запускается из этого тестового сценария ) (если я читаю это правильно).Эти байты хранят метод сжатия, а также флаги и флаги соответственно (согласно https://tools.ietf.org/html/rfc1950). Третий байт - это то место, где начинается различие, это либо идентификатор словаря, либо начало исходных входных данных.ближе к концу файла. Я предполагаю, что это, вероятно, разница в контрольной сумме ADLER32.

Кажется, что реализации zlib для go и Ruby не передают словарь в zlib по умолчанию (согласно go zlib source и ruby ​​zlib source )

Данные выглядят одинаково.

Я не уверен, есть ли ошибка реализации в библиотекахили если я просто что-то упускаю.

Почему эти выходы отличаются?

1 Ответ

0 голосов
/ 11 октября 2018

Алгоритм дефляции, как определено в RFC 1951 (который используется в формате zlib, определенном в RFC 1950, а также в gzip, определенном в RFC 1952), допускает изменения в реализации, которые могут привести к различным результатам при сжатии.Но эти результаты все равно будут распакованы до того же значения.Это позволяет компенсировать время сжатия до уровня сжатия и делает возможными также программы типа zopfli , которые обеспечивают лучшее сжатие, чем исходная библиотека zlib (за счет значительно большего времени сжатия).

Go использует собственную реализацию алгоритма deflate, написанного на Go, а ruby ​​использует библиотеку zlib .По этой причине ваши примеры создают разные сжатые выходные данные на одном входе.Но если вы возьмете вывод из программы Go или Ruby и распакуете (независимо от того, сделали ли вы Ruby или Go или какую-либо реализацию, соответствующую стандарту), это снова даст точно такое же значение.

...