Я просмотрел здесь много вопросов о «переполнении целых чисел в PHP», но я не могу найти ничего, что отвечает на мой конкретный вопрос, поэтому я надеюсь, что не пропустил существующий ответ.
Я хочу использовать хэш-функцию djb2 в PHP для хеширования ключей в нечто вроде идентификатора сегмента (индекс домена для SimpleDB). Он переполняет беззнаковые длинные целые, поэтому я не могу сделать это одинаково в обычном PHP, потому что собственные встроенные PHP-выражения имеют 32-битную подпись.
Итак, я попробовал математические расширения PHP bc и libgmp , которые допускают произвольную длину, и обходят проблему подписи / масштаба, но они делают ints "слишком большими" - т.е. они не переполняются.
Использование GMP, в частности, работает и, похоже, дает согласованные результаты, но, очевидно, на порядок медленнее, чем в C (0m0,017s против 0m0,002s). Я не знаю, является ли это просто потому, что это PHP против C, или это было бы значительно быстрее в PHP, если бы я мог заставить его переполниться. Я бы лучше проверил и выяснил, но я не вижу способа, чтобы это произошло.
Итак, есть ли способ заставить ULONG максимум в PHP? Должен ли я обернуть функцию C в расширение PHP? Или, учитывая, что я планирую хэшировать только короткие ключи (вероятно, 64 символа или меньше), это обеспечит серьезное снижение доходности?