Почему 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-разрядных значений с допустимой верхней половиной и недопустимой нижней половиной, плюс число с недопустимой верхней половиной и допустимой нижней половиной, а также число с обеими половинами недействительными.