Короткие url (mysql + php)
В интернете, множество сайтов, где используются короткие ссылки. Например youtube, tinyurl и подобные. Ссылка вида: http://www.youtube.com/watch?v=N98cpA5hdI0 куда приятнее чем было бы http://www.youtube.com/watch?v=23450928230945820532. Так же использование коротких ссылок необходимо если мы не хотим чтобы наш сайт легко парсили.
Очень часто начинающие программисты пытаются создать ссылки подобного вида на своих сайтах. Но делают это совсем странным способом, обычно создают строку со случайной последовательностью, проверяют есть ли уже подобная в базе данных, если есть создают новую и опять проверяют. Это очень дорогой подход и в базе данных у нас каша из набора символов. Не спорю, это тоже решение, очень даже верное, но не оптимальное. Обычно приходят к такому решению начитавшись форумов, сайтов с ответами или через поиск в том же гугл.
Оптимальное решение: использовать mysql в привычном виде, создать поле id типа int \ bigint, и использовать auto_increment для данного поля. Многие думают, что вдруг индекс будет огромным и выйдет за пределы, это напрасные опасения. Если логика программы верная, просто не получится дойти до границ int/bigint.
Но как же появятся короткие ссылки?
Использовать base62 с небольшим изменением, например мы хотим ссылку вида XXXXX, для этого достаточно прибавить произвольное значение к вашему id из базы данных.
class BaseConv { private static $base = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; public static function Base10($value, $b = 62) { if (!preg_match("/^[a-zA-Z0-9]+$/", $value)) return -1; $limit = strlen($value); $result = strpos(static::$base, $value[0]); for($i = 1; $i < $limit; $i++) { $result = $b * $result + strpos(static::$base, $value[$i]); } return $result; } public static function BaseX($value, $b = 62) { $r = $value % $b; $result = static::$base[$r]; $q = floor($value / $b); while ($q) { $r = $q % $b; $q = floor($q / $b); $result = static::$base[$r].$result; } return $result; } } function idToUrl($id) { return BaseConv::BaseX(100000000000 + $id); } function idFromUrl($id) { return BaseConv::Base10($id)-100000000000; }
Этот простой код поможет в ваших начинаниях. А если хочется чтобы каждая ссылка была из уникального набора символов, достаточно перемешать биты по маске и изменить порядок в базовом наборе символов.
Дальше простор для вашей фантазии.