Почему adler32 (0xFFFFFFFF, "") = 0xE000E? - PullRequest
0 голосов
/ 09 марта 2012

Я заметил, что функция zlib adler32 не всегда возвращает исходное начальное число при передаче пустой строки. Например:

adler32(0xFFFFFFFF,          // seed
        (const Bytef *) "",  // buffer
        0                    // length
       )

возвращает 0xE000E. Я думаю, что вместо этого должно возвращаться 0xFFFFFFFF.

Для большинства других значений он возвращает исходное начальное число. Однако для чисел 1965855 от 0 до 0xFFFFFFFF adler32 изменяет начальное число, когда входная строка пуста.

Это ошибка или странное поведение реализации, или диапазон функции Adler-32 на самом деле является подмножеством [0,0xFFFFFFFF]?

Обратите внимание, что когда указатель равен NULL, adler32 всегда возвращает 1 (начальное начальное число). Это задокументированное поведение.

1 Ответ

2 голосов
/ 09 марта 2012

Первый аргумент не является "семенем".Это предыдущее значение adler32, к которому добавляется.

Да, диапазон adler32 - это не все 32-битные значения.0xffffffff не является действительным adler32.Единственными допустимыми значениями adler32 являются те, в которых верхняя и нижняя 16-битные половины 32-битного значения, когда интерпретируются как целые числа, оба меньше 65521. Когда вы вызываете adler32 () с нулевой длиной, он возвращаетверхняя и нижняя половины по модулю 65521.

1965855 равно 65521 * 15 + 15 * 65521 + 15 * 15, что представляет собой число 32-разрядных значений с допустимой верхней половиной и недопустимой нижней половиной, плюс число снедопустимая верхняя половина и допустимая нижняя половина плюс число с недопустимыми обеими половинами.

...