Как создать слаг укороченного URL-ссылки, который имеет наименьшее количество цифр на основе записей в базе данных - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь выяснить алгоритм для создания слагаемого укороченного канала (т. Е. Просто ключа, а не всего короткого URL), который будет настолько коротким, насколько это возможно, исходя из количества представленных ссылок вбаза данных, в таблице Link.

Я сделал пару предположений:

1 - что на основе стандартных символов и незарезервированных символов RFC 3986 я мог бы работать в системе base 66 (26 + 26 + 10 + '-', '_', '.', '~').

2- Этот оператор case был наилучшим способом обработки размера установочной цифры для слагаемой выходной ссылки.Я думал, что будет более элегантный способ сделать это, но это было лучшее, что я мог придумать.

  def self.slug_characters(slug_digits)
    alphanumcase = [('a'..'z'), ('A'..'Z'), ('0'..'9')].map(&:to_a).flatten
    unreserved = ['-', '_', '.', '~']
    # unreserved = the balance of the RFC 3986 unreserved character set
    characters = [alphanumcase, unreserved].map(&:to_a).flatten
    (0...slug_digits).map { characters[rand(characters.length)] }.join
  end

  def self.generate_slug
    case Link.count
    when 0..66**1
      digits = 1
    when (66**1+1)..66**2
      digits = 2
    when (66**2+1)..66**3
      digits = 3
    when (66**3+1)..66**4
      digits = 5
    when (66**4+1)..66**5
      digits = 6
    when (66**5+1)..66**6
      digits = 7
    end

    self.slug_characters(digits)
  end
end

Я искал некоторые знания о том, что допустимо в URL, поскольку мое понимание несколько неясно с тем, что я смог исследовать.

Кроме того, учитывая мой предоставленный код,Я надеялся на более элегантный способ генерирования количества цифр слагов.

1 Ответ

2 голосов
/ 23 сентября 2019

Для подсчета слагаемых цифр вы, по сути, ищете, сколько времени будет иметь ваше число в базе 66. Это связано с вычислением логарифма числа в базе 66: логарифмическая цифра базы-66 1 (1 цифра вбаза 66) ​​равна 0, запись базы 66 для 66 (2 цифры в базе 66) равна 1, запись базы 66 ^ 2 (3 цифры в базе 66) равна 2 и т. д. Таким образом, (Math.log(Link.count, 66) + 1).floor должен дать вамномер, который вы ищете.

Обратите внимание, что у вас возникнут проблемы, если ваш Link.count равен 0, но не ясно, будете ли вы когда-либо запускать его в такой ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...