Я пытаюсь выяснить алгоритм для создания слагаемого укороченного канала (т. Е. Просто ключа, а не всего короткого 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, поскольку мое понимание несколько неясно с тем, что я смог исследовать.
Кроме того, учитывая мой предоставленный код,Я надеялся на более элегантный способ генерирования количества цифр слагов.