LZF может сжимать по разным алгоритмам - PullRequest
2 голосов
/ 15 марта 2011

Я использую libLZF для сжатия в моем приложении. В документации есть комментарий, который меня касается:

lzf_compress might use different algorithms on different systems and
even different runs, thus might result in different compressed strings
depending on the phase of the moon or similar factors.

Я планирую сравнить сжатые данные, чтобы узнать, был ли ввод идентичным. Очевидно, что если бы использовались разные алгоритмы, то сжатые данные были бы разными. Есть ли решение этой проблемы? Возможно, способ заставить определенный алгоритм каждый раз? Или этот комментарий не всегда верен на практике? В конце концов, phase of the moon, or similar factors немного странно.

Ответы [ 2 ]

6 голосов
/ 15 марта 2011

Причина "зависимости фазы Луны" заключается в том, что они не включают инициализацию некоторых структур данных, чтобы немного снизить производительность (конечно, только если это не влияет на правильность декомпрессии).Как и библиотеки сжатия, это не редкость.Таким образом, если вы поместите код сжатия в отдельный процесс за один раз, и ваша ОС обнулит память перед передачей ее процессу (все «большие» ОС делают, но некоторые меньшие могут этого не делать), то вы всегда получите то же самоеРезультат сжатия.

Кроме того, обратите внимание на следующее из lzfP.h:

/*
 * You may choose to pre-set the hash table (might be faster on some
 * modern cpus and large (>>64k) blocks, and also makes compression
 * deterministic/repeatable when the configuration otherwise is the same).
 */
#ifndef INIT_HTAB
# define INIT_HTAB 0
#endif

Так что я думаю, что вам нужно только #define INIT_HTAB 1 при компиляции libLZF, чтобы сделать его детерминированным, хотяне стал бы ставить на это слишком много без дальнейшего анализа.

6 голосов
/ 15 марта 2011

Распаковка на лету, затем сравнение.

Веб-сайт libLZF утверждает, что "распаковка [...] в основном на (неоптимизированной) скорости memcpy".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...