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