Создание короткого URL-адреса, подобного TinyURL.com

Я создаю новое веб-приложение, которое требует генерации внутреннего короткого URL-адреса, который будет использоваться в будущем, чтобы пользователи могли легко вернуться к определенной странице с очень длинным URL-адресом. Мои первоначальные мысли состоят в том, чтобы сохранить число в базе данных и вывести его в значение HEXADECIMAL, чтобы оно было короче целого. TinyURL.com, похоже, использует что-то другое, кроме HEXADECIMAL (несколько букв, смешанных с числами). Есть ли простой способ создать нечто подобное, что делает TinyURL?

Ответ 1

Пожалуйста, ознакомьтесь с этим хорошим объяснением по теме: Случайный браузер TinyURL (обновлено).

Важная часть:

Как мы установили, для TinyURL существует 62,193,780 возможных значений. TinyURL генерируются хэшем Base 36 (36, указывающим количество символов az и 0-9, массив возможных значений, из которых может быть сконструирован TinyURL), автоинкрементный MySQL с начальным значением, равным нулю.

BTW, еще один аналогичный вопрос, с помощью математического представления: Создание собственного uid интерфейса Tinyurl. И здесь некоторый исходный код .NET: Тип базы 36 для .NET(С#)

Ответ 2

Они используют кодировку base 36, и вы можете сделать ваше приложение более надежным, используя базу 64.

Вот что я попробую в Python (я вижу ваши языковые теги, простите меня):

#!/usr/bin/python

from base64 import b64encode
from hashlib import sha1

for i in range(5):
    salted_int = "<salt>%s</salt>" % i
    print b64encode(sha1(salted_int).hexdigest())[:6]

Выходы:

NTUwMz
ZTVmZD
OGEzNm
Njc2MT
YzVkNj

Таким образом, вы можете автоинкрементировать целое число и подавать его на какую-то функцию, подобную этой, и в итоге получить хорошие шансы на случайную группу строк. См. Также мой ответ на этот вопрос. Некоторые реализации base64 могут испускать косую черту / или знак плюса +, и поэтому вы должны следить за ними в своей реализации, поскольку они опасны в URL-адресах.

Хэши действительно гибкие и не позволяют вашим пользователям догадываться о следующем URL-адресе (если это важно для вас).

Ответ 3

Еще один open-source asp.net для изучения: мини-URL

Ответ 4

Недавно я увидел что-то подобное на codeplex для sharepoint, и они, казалось, использовали шестнадцатеричные числа для сокращения URL. Возможно, стоит посмотреть, как они это делают здесь http://spurlshortener.codeplex.com/

Ответ 5

Мои первоначальные мысли состоят в том, чтобы сохранить число в базе данных и вывести его в значение HEXADECIMAL, чтобы оно короче целого.

В чем смысл держать что-то короче целого?
Поэтому вы хотите иметь URL-адрес: http://here.there/ 12D687 вместо http://here.there/ 1234567?

Если вы спросите меня, какой из них легче для меня, я расскажу последний.
Но, честно говоря, я не вижу смысла в моем примере, поскольку оба они почти одинаковы.

Есть ли простой способ создать нечто подобное, что делает TinyURL?

Да. Попросите пользователя предоставить его.
Если невозможно просто использовать простой целочисленный id. Что может быть проще...