rubyにて短縮URLの様な処理をしてみる(数値を出来るだけ短い文字列で表現したい)

基本は以下のURLのものです。デコードが無かったので作ってみました

http://blog2.terawarosu.com/2011/03/ruby-1064.html

# coding: utf-8

class NumberShorter
  def self.decode(st,seed=nil)
    seed ||= ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a + ["-","="]
    st.gsub(/./) do |s|
      ret = seed.index(s)
      ret = ret.to_s(8)
      ret = '0' + ret if ret.size == 1
      ret
    end.to_i(8)
  end

  def self.encode(number,seed=nil)
    seed ||= ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a + ["-","="]
    s = number.to_s(8).to_s
    s = "0#{s}" unless s.length % 2 == 0 
    s.gsub(/\d\d/){|s| seed[s.to_i(8).to_s(10).to_i]}
  end
end

if __FILE__ == $0
  seed = ('0'..'9').to_a + ('a'..'z').to_a + ('A'..'Z').to_a + ["-","="]

  [(0..20000),(5000000000..5000000100),(10000000000000000..10000000000001000)].each do |range|
    range.each do |i|
      #puts '=' * 80
      #p i
      encoded = NumberShorter::encode(i,seed)
      #p encoded
      decoded = NumberShorter::decode(encoded,seed)
      #p decoded
      raise 'unmatch' unless i == decoded
    end
  end
end