Итак, давайте подробней обсудим, как будет формироваться наша cтрока в формате md5. Конечно, можно использовать любой другой алгоритм ее формирования, и необязательна эта строка должна быть похожа на md5-строку. И, конечно же, наш способ приведен исключительно в качестве примера. Мы предлагаем формировать строку в формате md5 с учетом следующих условий:
Будем использовать "маскирующую" часть 1 фиксированной длины в 5 символов; для этого сгенерируем с помощью функции md5() ( http://webscript.ru///www.php.net/manual/en/function.md5.php/ ) строку и будем использовать ее первые 5 символов:
define('PART1_LENGTH', 5);
//...
srand(time());
$part_1 = substr(md5(uniqid(mt_rand())), 0, PART1_LENGTH);
Будем использовать "разделяющую" часть 2 фиксированной длины в 3 символа, который будем случайным образом выбирать из заранее определенной строки $t_str
:
define('PART2_LENGTH', 3);
//...
srand(time());
$t_str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
$part_2 = substr($t_str, 0, PART2_LENGTH);
Аналогично "разделяющей" части 2, найдем "разделяющую" часть 3:
define('PART3_LENGTH', 2);
//...
srand(time());
$t_str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
$part_3 = substr($t_str, 0, PART3_LENGTH);
Теперь совместим все части вместе. Получим результирующую строку вида:
$res = $part_1.$curindex.$part_2.$total.$part_3;
где
- $part_1 - "маскирующая" часть 1, полученная на шаге 1;
- $curindex - номер текущей страницы;
- $part_2 - "разделяющая" часть 2, полученная на шаге 2;
- $total - общее число элементов
- $part_3 - "разделяющая" часть 3, полученная на шаге 3.
Длина нашей строки $res
, полученной на шаге 4, может быть меньше, чем 32 символа, и поэтому, поскольку мы создаем строку в формате md5, сгенерируем с помощью функции md5() ( http://webscript.ru///www.php.net/manual/en/function.md5.php/ ) еще одну, "дополняющую" строку и будем использовать ее для "дополнения" до 32-х символов нашей строки $res
. Для этого воспользуемся функцией str_pad() ( http://webscript.ru///www.php.net/manual/en/function.str_pad.php/ ):
define('GENERAL_LENGTH', 32);
//...
srand(time());
$res = str_pad($res, GENERAL_LENGTH, md5(uniqid(mt_rand())), STR_PAD_RIGHT);
где функция str_pad() ( http://webscript.ru///www.php.net/manual/en/function.str_pad.php/ ) принимает следующие параметры (более подробно - см. описание функции на сайте //www.php.net ( http://webscript.ru///www.php.net )):
- $res - результирующая строка, полученная на шаге 4;
- GENERAL_LENGTH - длина строки, которая будет сравниваться с длиной строки
$res
; если длина строки $res
меньше, чем GENERAL_LENGTH, то наша строка $res
будет дополнена в соответствии с последующими двумя параметрами до длины GENERAL_LENGTH;
- md5(uniqid(mt_rand())) - случайным образом сгенерированная строка в формате md5, которая будет использоваться до "дополнения" нашей строки
$res
до длины GENERAL_LENGTH;
- STR_PAD_RIGHT - означает, что "дополняющая" строка будет добавляться к нашей строке
$res
справа.
Оформим формирование строки в формате md5 в виде отдельной функции:
define('PART1_LENGTH', 5);
define('PART2_LENGTH', 3);
define('PART3_LENGTH', 2);
define('GENERAL_LENGTH', 32);
//...
function makeSecureParam($curindex, $total){
srand(time());
$part1 = substr(md5(uniqid(mt_rand())), 0, PART1_LENGTH);
srand(time());
$t_str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
$part2 = substr($t_str, 0, PART2_LENGTH);
srand(time());
$t_str = eregi_replace('[0-9]', '', md5(uniqid(mt_rand())));
$part3 = substr($t_str, 0, PART3_LENGTH);
srand(time());
return str_pad($part1.$curindex.$part2.$total.$part3,
GENERAL_LENGTH,
md5(uniqid(mt_rand())),
STR_PAD_RIGHT );
}
Итак, основная идея нами реализована : мы создали функцию, позволяющую "прятать" параметры системы постраничного вывода внутрь одной, специального вида строки. Какие преимущества нам это дает? Поскольку теперь наша система постраничного вывода характеризуется всего одним параметром, то это даст нам возможность встраивать систему постраничного вывода в контекст, а не наоборот, как это было раньше. Осталось только реализовать класс, который позволил бы принимать эту специального вида строку и преобразовывать ее в соответствующие параметры навигационной системы.