У меня есть какой-то устаревший код C (как макрос), который я не могу ни изменять, ни заменять.
Этот код (в конечном итоге) выводит строку дайджеста (C) на основе исходной строки, выполняя операцию над значением хеш-функции для каждого символа в строке.
#define DO_HASH(src, dest) { \
unsigned long hash = 1111; // Seed. You must NOT change this. \
char c, *srcPtr; \
int i; \
unsigned char hashedChar; \
\
srcPtr = src; \
c = *srcPtr++; \
while ( c) { \
hash = ((hash << 5) + hash) + c; \
c = *srcPtr++; \
} \
... // etc.
} //
Несколько лет назад мне пришлось реализовать его на PHP как функцию, возвращающую строку дайджеста. Функция PHP должна одинаково воспроизводить результаты Си.
function php_DO_HASH($srcStr)
{
$hash = 1111; // Seed. You must NOT change this.
$index = 0;
$c = $srcStr[$index];
while ($c) {
$hash = (($hash << 5) + $hash) + ord($c);
$index++;
$c = $srcStr[$index];
}
... // etc.
}
Это успешно работает в течение нескольких лет. Тем не менее, в последние несколько дней мой сервер обновился до новой версии CentOS, но говорит, что они не изменили версию PHP. С тех пор два кода теперь генерируют разные выходные данные.
Может кто-нибудь посоветовать, что я делаю неправильно в версии PHP? Спасибо.