Я хочу создать службу сокращения URL-адресов, в которой вы можете записать длинный URL-адрес в поле ввода, а служба сокращает URL-адрес до " http://www.example.org/abcdef
".
Вместо " abcdef
" может быть любая другая строка, содержащая шесть символов a-z, A-Z and 0-9
. Это составляет 56 ~ 57 миллиардов возможных строк.
Мой подход:
У меня есть таблица базы данных с тремя столбцами:
- id, целое число, автоинкремент
- long, string, длинный URL, введенный пользователем
- короткий, строка, сокращенный URL (или только шесть символов)
Затем я вставил бы длинный URL в таблицу. Затем я бы выбрал значение автоинкремента для " id
" и построил его хеш. Этот хеш должен быть вставлен как " short
". Но какой хеш я должен создать? Алгоритмы хеширования, такие как MD5, создают слишком длинные строки. Я не использую эти алгоритмы, я думаю. Самостоятельный алгоритм тоже подойдет.
Моя идея:
Для " http://www.google.de/
" я получаю идентификатор автоинкремента 239472
. Затем я делаю следующие шаги:
short = '';
if divisible by 2, add "a"+the result to short
if divisible by 3, add "b"+the result to short
... until I have divisors for a-z and A-Z.
Это может повторяться до тех пор, пока число больше не будет делиться. Как вы думаете, это хороший подход? У тебя есть идея получше?
Из-за постоянного интереса к этой теме я опубликовал эффективное решение для GitHub с реализациями для JavaScript , PHP , Python и Java . Добавьте ваши решения, если хотите :)
encode()
иdecode()
функции. Поэтому необходимо выполнить следующие шаги: (1) сохранить URL-адрес в базе данных (2) получить уникальный идентификатор строки для этого URL-адреса из базы данных (3) преобразовать целочисленный идентификатор в короткую строкуencode()
, например,273984
вf5a4
(4) использовать короткую строку (напримерf4a4
) в URL для общего доступа (5) При получении запроса на короткую строку (например20a8
), декодируйте строку в целочисленный идентификатор с помощьюdecode()
(6). Найдите URL в базе данных для данного идентификатора. Для конвертации используйте: github.com/delight-im/ShortURL