Алгоритм сокращения URL

теперь речь идет не только о сокращении URL, но моя цель такова, так что давайте посмотрим на это так. Конечно, шаги по сокращению URL-адресов:

  1. возьмите полный URL
  2. создайте уникальную короткую строку, которая будет ключом для URL
  3. храните URL и ключ в базе данных (хранилище ключей-значений будет идеальным совпадением здесь)

теперь о втором пункте. Вот что я придумал с:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(baos);
UUID uuid = UUID.randomUUID();
dos.writeLong(uuid.getMostSignificantBits());
String encoded = new String(Base64.encodeBase64(baos.toByteArray()), "ISO-8859-1");
String shortUrlKey = StringUtils.left(encoded, 6); // returns the leftmost 6 characters
// check if exists in database, repeat until it does not

этого достаточно?

2 ответов


для приложения загрузки файлов, которое я написал, мне тоже нужна эта функциональность. Прочитав это так статьи, Я решил придерживаться только некоторых случайных чисел и проверить, существуют ли они в БД.

Так что ваш подход похож на то, что я сделал.


Ну, что вы подразумеваете под сокращением URL?

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

пример из Amazon:http://www.amazon.de/Bauknecht-WA-PLUS-614-Waschmaschine/dp/B003V1JDU8/

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

однако вы можете сохранить свои ссылки чистыми и проверить, правильно ли это, и сделать 301 пересылку на реальный URL или поместить канонический URL, если появится неправильный URL.

однако:

Если вы хотите сделать что-то вроде файл TinyURL мой ответ-категорическое нет.

этого недостаточно.

Ну, это зависит.

Это не "безопасный". Было бы довольно легко угадать url. Лучшим подходом было бы использование некоторые криптографические функции, такие как SHA-1/MD5.

когда дело доходит до столкновений я не могу сказать. GUID был разработан без коллизий, но вы используете только первые 6 символов. Я не знаю, что именно они представляют в алгоритме. Но это определенно не оптимально.

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

о проекте Я использовал что-то вроде

/ database-primary-key / hash-of-primary-key-with-some-token-or-client-information/

таким образом, я мог напрямую искать первичный ключ в базе данных, что было самым быстрым возможным способом, но также мог проверить, что ссылка не была обнаружена грубым принудительным хэшем. В моем случае хэш был суммой SHA-1 секретного токена клиента и первичного ключа.