Рубрики
Без рубрики

Крошечный дизайн URL и код ✔️

Это простая функция кодирования() и декодирования(). Обратите внимание, что мы не создали хеширование MD5… Помечено системами, учебником, java, архитектурой.

Это простая функция кодирования() и декодирования() .

Обратите внимание, что мы не создали здесь подход хеширования 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 ResponseEntity getAndRedirect(@PathVariable String shortUrl) {
        var url = urlService.getOriginalUrl(shortUrl);
        return ResponseEntity.status(HttpStatus.FOUND)
                .location(URI.create(url))
                .build();
    }
}

Проблемы:

  1. мы полагаемся на один идентификатор таблицы БД для генерации идентификаторов
  2. не масштабируемый, как мы обрабатываем URL-адрес возврата фиксированного размера
  3. как мы разрешаем настраиваемые URL-адреса
  4. можем ли мы повторно использовать короткий URL-адрес, который удален/срок действия которого истек?

Я буду работать над более распределенными решениями в следующих публикациях, спасибо, что пришли сюда. Вот это 🍪

Оригинал: “https://dev.to/saurabhpro/a-tiny-url-design-2b5l”