Алгоритм сокращения 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
этого достаточно?
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 секретного токена клиента и первичного ключа.