Сокращенный URL: лучший метод кодирования? - PullRequest
12 голосов
/ 04 марта 2010

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

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

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

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

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

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

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

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

Ответы [ 2 ]

11 голосов
/ 04 марта 2010

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

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

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

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

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

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

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

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

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

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

...