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

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

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

  • Возьмите полный URL
  • Создайте уникальную короткую строку, которая будет ключом для URL
  • Сохраните 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

Достаточно ли это?

4b9b3361

Ответ 1

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

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

Ответ 2

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

Существуют разные методы. Большинство веб-сайтов, AFAIK, используют эту технику, чтобы просто поместить первичный ключ базы данных (возможно, в некотором закодированном виде) в 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 символов.

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

/базы данных первичного ключа/хэш-из-первичного ключа-с некоторыми-токен или-клиент-информация/

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