Почему adler32(0xFFFFFFFF, "") = 0xE000E?

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

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

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

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

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

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

1 ответ

Решение

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

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

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

Другие вопросы по тегам