TinyURL. Шаг 2. Кодирование и декодирование ссылки

Продолжаю создание собственного скрипта для реализации сервиса коротких сообщений и сегодня расскажу о том, как собираюсь хранить данные и кодирвать ссылки

Для того чтобы на возникло лишних проблем с генерацией адресов, я собираюсь использовать для кодирования прописные и строчные буквы латинского алфавита, а так же цифры от 0 до 9. В выбраном наборе 62 символа и для моего небольшого сервиса мне вполне хватит 4 значащих символов, с помощью которых можно закодировать 14776336 адресов.

Теперь надо придумать, как хранить ссылки и их псевдонимы без исползования базы данных. Я предлагаю разбить ключ на две половины и одну из них использовать в качестве имени файла (таких файлов в конечном итоге будет создано 3844, но на начальном этапе мы ограничимся меньшим числом), а вторую в качестве индекса массива, который хранится в этом файле и содержит искомый URL.

Такой способ будет более быстрым, чем хранение огромного массива в рамках одного фала и уж никак не медленне БД. Однако стоит учесть, что отказ от MySQL делает очень дорогой задачу поиска конкетного URL в массиве. Впрочем для нашего сервиса подобная функциональность совершенно не нужна.

Для кодирования переданного нам адреса мы будем выбирать случайное число из диапазона (1, pow(62, 4)) и после кодирования возвращать его пользователю. Поэтому опишем две функции для прямого и обратного преобразования. По суть это функция перевода из десятичного числа в 62-риное и обратно. (если использовать набор символов "0123456789ABCDEF", то функции будут осуществлять перевод DEC - HEX)

  1.  
  2. function tinyurl_encode($key, $num, $minwidth = 2)
  3. {
  4. $str = '';
  5. $base = strlen($key);
  6. while($num > 0)
  7. {
  8. $residue = $num % $base;
  9. $str = $key[$residue] . $str;
  10. $num = floor($num / $base);
  11. }
  12. if(strlen($str) < $minwidth)
  13. {
  14. $str = str_repeat('0', $minwidth - strlen($str)) . $str;
  15. }
  16. return $str;
  17. }
  18.  
  19. function tinyurl_decode($key, $str)
  20. {
  21. $num = 0;
  22. $base = strlen($key);
  23. $cnt = strlen($str);
  24. for($i = 0; $i < $cnt; $i++)
  25. {
  26. $char = $str[$cnt - $i - 1];
  27. $num += strpos($key, $char) * pow($base, $i);
  28. }
  29. return $num;
  30. }
  31.  
  32. echo "<pre>";
  33. $len = 4;
  34. $key = '0123456789qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';
  35. $base = strlen($key);
  36. $num = rand(0, pow($base, $len) - 1);
  37. echo $num . "<br>";
  38. $str = tinyurl_encode($key, $num, $len);
  39. echo $str . "<br>";
  40. $num = tinyurl_decode($key, $str);
  41. echo $num . "<br>";
  42. echo "</pre>";
  43.  

Ничего сложного или нового в коде, конечно нет, но для тех, кто начинает изучать PHP он может оказаться полезным. Итак, второй шаг в создании сервиса коротких сообщений сделан и в следующий раз мы будем говорить об интерфейсе.

Читайте в блоге

TinyURL. Шаг за шагом. Шаг 1
PHP. Сохранение массива в файл
Использование md5 в Oracle.
Несколько слов об использовании Mercurial.
MFC. Использование HTML-интерфейса.

Комментарии:

Войдите на сайт, чтобы оставить комментарий