Я хочу створити службу скорочення 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