Подтвердить что ты не робот

Укорачивание URL: лучший метод кодирования?

Я создаю службу сокращения ссылок, и я использую кодировку/декодирование base64 поля с добавленным идентификатором для создания моих URL-адресов. URL с идентификатором "6": http://mysite.com/Ng==

Мне также нужно разрешить пользователям создавать настраиваемое имя URL-адреса, например http://mysite.com/music

Вот мой (возможно, ошибочный) подход. Помочь в ее исправлении было бы полезно.

Когда кто-то создает новую ссылку:

  • Я получаю самый большой идентификатор ссылки из базы данных (он не увеличивается автоматически)
  • Увеличение идентификатора на 1
  • Создайте короткий URL-код (http://website.com/[short url name]) с помощью base64_encoding, что ID
  • Вставить в таблицу ссылок: id, short_url_code, destination_url

Когда кто-то создает новую ссылку и передает собственный короткий URL-адрес:

  • Мой план был base64_decode своей пользовательской строкой и использовал это как идентификатор ссылки, но я не понимал, что вы не можете просто base64_decode любую буквенно-цифровую строку и превратить ее в число.

Есть ли лучший метод кодирования, который позволит мне превратить любое число в короткую строку и любую строку в число, поэтому я всегда могу найти короткие URL-адреса (независимо от того, был ли пользователь или автогенерирован), превратив имя в число и запрос для ссылки с идентификатором, равным этому числу?

4b9b3361

Ответ 1

Прежде всего, убедитесь, что в столбцах ID и short_url_code есть ограничения на единство.

Когда кто-то создает новую ссылку:

  • Получите следующую большую ссылку ID из базы данных ( по соображениям производительности, вы действительно должны ДЕЙСТВИТЕЛЬНО использовать autoincrement или SEQUENCE, в зависимости от того, что предлагает ваша СУБД, в противном случае выберите и выберите MAX(ID)+1)
  • Создайте короткий URL-адрес (http://website.com/[short url name]) из ID с помощью base64_encode или любой другой стандартной или стандартной схемы кодирования
  • Вставить в таблицу links: ID, short_url_code, destination_url
  • Если сбой вставки из-за нарушения ограничения, вернитесь к шагу 1, чтобы попробовать новый ID; у вас может быть нарушение, потому что:

    • тот же идентификатор уже использовался (т.е. вставлен) параллельно другим потоком/процессом и т.д. (это не произойдет, если вы использовали autoincrement или SEQUENCE и могут часто встречаться в противном случае) и/или
    • тот же short_url_code уже используется как пользовательский URL (это произойдет очень редко, если кто-то не пытается вызвать проблемы на вашем сайте).
  • Если вставка выполнена успешно, скопируйте и верните короткий URL-адрес пользователю

Когда кто-то создает новую ссылку и передает собственный короткий URL-адрес:

  • Выполните тот же шаг 1, что и выше.
  • Вместо того, чтобы генерировать короткую часть URL из ID, как на шаге 2 выше, использовать пользовательский short_url_code, предоставленный пользователем
  • Выполните тот же шаг 3, что и выше.
  • Если вставка не удалась из-за:
    • нарушение ограничения на ID: вернитесь к шагу 1, чтобы попробовать новый ID
    • нарушение ограничения на short_url_code: вернуть пользователю ошибку, требуя, чтобы он выбрал другой настраиваемый URL-адрес, поскольку короткий URL, который он предоставил, уже был использован
  • Выполните тот же шаг 5, что и выше.

Ответ 2

base64 можно использовать для создания коротких URL-адресов, но он также может сделать URL-адрес более длинным. Например, base64_encode числа 1 является "MQ ==", размер которого в 4 раза больше. Base64 всегда будет иметь 2 символа для получения 64 бит, что не подходит для коротких URL-адресов.

Если размер является самым важным фактором, то вы, возможно, сможете создавать кратчайшие URL-адреса, опираясь на интернационализация.

Это может сделать URI довольно длинным (до 9 символов ASCII для одного символа Unicode), но намерение состоит в том, что браузеру нужно отображать только декодированную форму, и многие протоколы могут отправлять UTF-8 без экранирования% HH.

Имейте в виду, что браузеры хорошо работают с UTF-8, и твиттер не будет иметь проблем с этими URL-адресами.