Ruby on rails 如何创建一个基于数据库中记录的最少位数的url链接缩短器slug
我正试图找出一种算法来生成一个链接缩短器slug(即,仅是键,而不是整个短url),它将根据数据库中提交的链接数量,在tableRuby on rails 如何创建一个基于数据库中记录的最少位数的url链接缩短器slug,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正试图找出一种算法来生成一个链接缩短器slug(即,仅是键,而不是整个短url),它将根据数据库中提交的链接数量,在tablelink上尽可能短 我做了几个假设: 1-根据标准字符和未保留的RFC3986字符,我可以在base 66系统中工作(26+26+10+'-'、''''.'、'.'、'~') 2-此case语句是处理输出链接段塞设置数字大小的最佳方法。我以为会有一个更优雅的方法来做这件事,但这是我能想到的最好的方法 def self.slug_characters(slug_dig
link
上尽可能短
我做了几个假设:
1-根据标准字符和未保留的RFC3986字符,我可以在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中什么是允许的知识,因为从我所能研究的内容来看,我的理解有些模糊
另外,根据我提供的代码,我希望有一种更优雅的方法来生成段塞数字计数。对于段塞数字计数,您基本上是在寻找数字在基数66中的长度。这与计算基数66中数字的对数有关:1的基数66对数(基数66中的1位数字)为0,66的基数66对数(基数66中的2位数字)为1,66^2的基数对数(基数66中的3位数字)为2,等等。因此
(Math.log(Link.count,66)+1)。floor
应该给出您要查找的数字
请注意,如果你的
Link.count
为0,你会遇到问题,但不清楚你是否会在这种情况下运行它。对于slug digits count,你基本上是在寻找你的数字在基数66中的时间。这与计算基数66中数字的对数有关:1的基数66对数(基数66中的1位数字)为0,66的基数66对数(基数66中的2位数字)为1,66^2的基数对数(基数66中的3位数字)为2,等等。因此(Math.log(Link.count,66)+1)。floor
应该给出您要查找的数字
请注意,如果Link.count
为0,您将遇到问题,但不清楚您是否会在这种情况下运行它