Это простая функция кодирования()
и декодирования()
.
Обратите внимание, что мы не создали здесь подход хеширования MD5, так как это касается только концепции.
Шаг:
кодировать()
- сохраните длинный URL-адрес в бд, получите уникальный длинный идентификатор из бд для этого URL-адреса
- передайте этот длинный идентификатор в
код(идентификатор)
функция - так для длинного значения мы продолжаем увеличивать его на 62, выбираем значение из массива allowedchars и продолжаем добавлять его
- убедитесь в том, чтобы отменить созданную строку
private static final String allowedString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; private final char[] allowedCharacters = allowedString.toCharArray(); private final int base = allowedCharacters.length; // 62 public String encode(long input){ var encodedString = new StringBuilder(); if(input == 0) { return String.valueOf(allowedCharacters[0]); } while (input > 0) { encodedString.append(allowedCharacters[(int) (input % base)]); input = input / base; } return encodedString.reverse().toString(); }
декодировать()
- отправьте последнюю часть URL-адреса, которая является закодированной строкой
- преобразуйте строку в массив
- из первого значения мы выбираем индекс значения и умножаем его на
62^ оставшиеся символы
- номер – это декодированный идентификатор
public long decode(String input) { var characters = input.toCharArray(); var length = characters.length; var decoded = 0; //counter is used to avoid reversing input string var counter = 1; for (char character : characters) { decoded += allowedString.indexOf(character) * Math.pow(base, length - counter); counter++; } return decoded; }
Поэтому, если у нас есть декодированный URL-адрес, мы могли бы просто вернуть его в качестве местоположения заголовка – с кодом ответа 302 (НАЙДЕНО)
@GetMapping(value = "{shortUrl}") public ResponseEntitygetAndRedirect(@PathVariable String shortUrl) { var url = urlService.getOriginalUrl(shortUrl); return ResponseEntity.status(HttpStatus.FOUND) .location(URI.create(url)) .build(); } }
Проблемы:
- мы полагаемся на один идентификатор таблицы БД для генерации идентификаторов
- не масштабируемый, как мы обрабатываем URL-адрес возврата фиксированного размера
- как мы разрешаем настраиваемые URL-адреса
- можем ли мы повторно использовать короткий URL-адрес, который удален/срок действия которого истек?
Я буду работать над более распределенными решениями в следующих публикациях, спасибо, что пришли сюда. Вот это 🍪
Оригинал: “https://dev.to/saurabhpro/a-tiny-url-design-2b5l”