Побитовые Операции Над Большими Строками В PHP
Вот в чем моя проблема. В настоящее время я пытаюсь внедрить несколько стандартов криптографии в PHP по соображениям совместимости. Тот, над которым я сейчас работаю, - это SHA256 и SHA512. Они оба являются достаточно прямыми стандартами, и у меня с этим нет проблем.
Однако SHA512 требует побитовых операций с 64-разрядными целыми числами. Поскольку PHP может иметь только 32-разрядные целые числа (с компиляцией), это оставляет меня с проблемой. Как мне реализовать необходимые побитовые функции (по модулю, сдвигу, повороту, добавлению, исключению или и т. Д.), Чтобы я поддерживал совместимость и разумный уровень производительности...
Я знаю, что для некоторых из них реализация функций тривиально выполняется с 2 32-битными входами. Однако, как это будет работать для shift
и rotate
?
Что я думал сделать, так это сохранить строки в двоичной форме (в виде строки 01010
). Таким образом, все побитовые операции будут полностью независимы от архитектуры. Но это, скорее всего, вызовет массовый производительность падает, так как они невероятно часто используются в стандартах (и в других частях библиотеки).
Итак, мой вопрос таков: как я могу легко разрешить по крайней мере 64-битные строковые операции в 32-битной компиляции PHP, сохраняя при этом разумный уровень производительности для каждого шага...?
О, и моя цель - переносимость здесь, так что никаких расширений. Другие библиотеки я рассмотрю, но они должны быть портативными...
3 answers
Хранение значений в строках - действительно правильный путь.
Но вместо того, чтобы хранить 1 и 0, просто храните 8 бит в каждом байте. По-прежнему будет легко извлечь части целого числа из вашей строки. Вам действительно нужно вручную выполнять все операции, такие как переключение.
Вы могли бы использовать bcmath. Он зарекомендовал себя очень хорошо и работает с PHP с 4.0.4
Очевидно, что нет способа использовать собственную структуру данных, которая представляет ints в вашей среде, и поэтому вы должны использовать структуру данных сверху. Это, конечно, будет означать, что вы не сможете применить приведенный вами пример... 0xFFFFFFFF>> 4 но вы могли бы использовать mystruct (0xFFFFFFFF) >> 4 (mystruct - это структура данных, определенная вами).
Если это звучит как план, дайте мне знать, и, возможно, я смогу помочь вам с остальной частью решения.