2015-06-14 3 views
0

Я реализовал кастинг Adler32 в PHP, но поскольку ord настолько медленный (около 1 МБ в секунду на моей машине для разработчиков), чтобы получить целые значения chanters в строке, это решение не работает для файлов размером 100 МБ +.Быстрая реализация катящегося хеша в PHP

функция Mhash PHP может получить очень быстрый расчет для Adler32 (120Мб в секунду на моем Dev машины). Однако Mhash, кажется, не поддерживает качение характера Adler32, так что вы должны вычислить совершенно новый Adler32 как Циклические двигается, а не просто пересчитать хэш двух байт, которые на самом деле изменились.

Я не привязан к алгоритму Adler32, мне просто нужно очень быстро качению хэш в PHP.

ответ

1

вызова низкие два байта Adler-32 и высокие два байта В, где это Адлер-32 последовательность {x1, x2, ..., хп}.

Чтобы получить Adler-32 из {х2, ..., х}, вычесть x1 от , по модулю 65521, и вычесть п * x 1 + 1 от B, снова по модулю 65521.

Обратите внимание, что если ваш размер окна п случается быть кратным 65521, то вы можете просто вычесть один из B (по модулю 65521). Так что это может быть хороший размер окна, если можно. Также обратите внимание, что если n больше 65521, то вы можете умножить x1 на (n modulo 65521). Если n является константой, вы можете сделать это по модулю заблаговременно.

(Обратите внимание, что % оператор в C и PHP является не операцию по модулю, а операция остальное. Таким образом, вы должны заботиться с отрицательными числами.)

+0

Привет Марк, спасибо за написание ответ. Однако моя проблема заключалась не в реализации вашего (?) Алгоритма (я уже это сделал), а в его реализации в PHP. Получение байтов из строки PHP для работы, кажется, медленный процесс, около 1 МБ в секунду. Внутренняя реализация mhash adler32 отчетливо считывает байты из строки примерно на три порядка или быстрее, но она не дает возможности использовать катящийся характер алгоритма. – Dom

+0

Плюс один за очень полезные советы о модуле. – Dom

+0

Мой ответ решает этот вопрос вы заявили: «так что вы должны вычислить совершенно новый Adler32 как Циклический движется, а не просто пересчитать хэш двух байтов, которые на самом деле изменилось.» Вам не нужно вычислять новый Adler-32 для всего окна, а просто обновлять его для байтов, сброшенных с начала и добавленных в конец. Я ничего не могу сделать о внутренних реализациях PHP. –

Смежные вопросы