如何在 twitter 中实现像 urls 这样的短 url? [英] how to implement a short url like urls in twitter?

查看:51
本文介绍了如何在 twitter 中实现像 urls 这样的短 url?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果有很长的url,我想生成一个像twitter一样的短url,有没有办法在ruby中实现?

If there is a long url, i want to generate a short url like those in twitter, is there some way to implement in ruby?

提前致谢.

推荐答案

最简单的方法是:

  1. 保留所有 URL 的数据库
  2. 当你在数据库中插入一个新的 URL 时,找出自动递增的整数主键的 id.
  3. 将该整数编码为基数 36 或 62(数字 + 小写字母或数字 + 大小写混合字母).瞧!你有一个短网址!

在 Ruby 中编码到 base 36/从 base 36 解码很简单:

Encoding to base 36/decoding from base 36 is simple in Ruby:

12341235.to_s(36)
#=> "7cik3"

"7cik3".to_i(36)
#=> 12341235

编码为 base 62 有点麻烦.这是一种方法:

Encoding to base 62 is a bit tricker. Here's one way to do it:

module AnyBase
  ENCODER = Hash.new do |h,k|
    h[k] = Hash[ k.chars.map.with_index.to_a.map(&:reverse) ]
  end
  DECODER = Hash.new do |h,k|
    h[k] = Hash[ k.chars.map.with_index.to_a ]
  end
  def self.encode( value, keys )
    ring = ENCODER[keys]
    base = keys.length
    result = []
    until value == 0
      result << ring[ value % base ]
      value /= base
    end
    result.reverse.join
  end
  def self.decode( string, keys )
    ring = DECODER[keys]
    base = keys.length
    string.reverse.chars.with_index.inject(0) do |sum,(char,i)|
      sum + ring[char] * base**i
    end
  end
end

...它正在发挥作用:

...and here it is in action:

base36 = "0123456789abcdefghijklmnopqrstuvwxyz"
db_id = 12341235
p AnyBase.encode( db_id, base36 )
#=> "7cik3"
p AnyBase.decode( "7cik3", base36 )
#=> 12341235

base62 = [ *0..9, *'a'..'z', *'A'..'Z' ].join
p AnyBase.encode( db_id, base62 )
#=> "PMwb"
p AnyBase.decode( "PMwb", base62 )
#=> 12341235

编辑

如果您想避免使用恰好是英文单词的 URL(例如,四个字母的脏话),您可以使用一组不包含元音的字符:

If you want to avoid URLs that happen to be English words (for example, four-letter swear words) you can use a set of characters that does not include vowels:

base31 = ([*0..9,*'a'..'z'] - %w[a e i o u]).join
base52 = ([*0..9,*'a'..'z',*'A'..'Z'] - %w[a e i o u A E I O U]).join

然而,这样你仍然会遇到诸如 AnyBase.encode(328059,base31)AnyBase.encode(345055,base31)AnyBase.encode 之类的问题(450324,base31).因此,您可能还想避免类似元音的数字:

However, with this you still have problems like AnyBase.encode(328059,base31) or AnyBase.encode(345055,base31) or AnyBase.encode(450324,base31). You may thus want to avoid vowel-like numbers as well:

base28 = ([*'0'..'9',*'a'..'z'] - %w[a e i o u 0 1 3]).join
base49 = ([*'0'..'9',*'a'..'z',*'A'..'Z'] - %w[a e i o u A E I O U 0 1 3]).join

这也将避免这是 0 还是 O?"的问题.和这是 1 还是 I?".

这篇关于如何在 twitter 中实现像 urls 这样的短 url?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆