0

アプリで ID の単純な難読化/短縮化を行うことを検討しています。このために、整数を文字列に、またはその逆にマップしたいと思います。

次のように簡単に交換できますto_ito_s

>> 635.to_s(36)
# => "hn"
>> "hn".to_i(36)
# => 635

これは 0-9 と az を考慮していますが、機能的には と同等である AZ (大文字) も考慮したいと思いますto_s(62)

Ruby や Rails でこれを行う簡単な方法はありますか?

編集

可能であれば、0-9、az、および AZ でこれを行いたいと考えています。文字列は URL に適している必要があり、URL の値を区切るために他の文字を使用している-ので、それらを避けるのが最善です。

4

2 に答える 2

2

base 58 を使用できます。そのための gem があります: http://rubygems.org/gems/base58

require 'base58'

Base58.encode(12345) # => 4ER
Base58.decode('4ER') # => 12345

コメントで指摘されているように、これにより、 、 、 などの潜在的にあいまいな文字が除外Il0ますO

于 2013-10-16T05:34:47.773 に答える
1

私が説明したことを正確に行う base62 と呼ばれる宝石があることがわかりました。

https://github.com/jtzemp/base62

require 'base62'

>> 635.base62_encode
=> "AF"
>> "AF".base62_decode
=> 635

また、難読化/短縮が必要なモデルに混在できるモジュールを使用して、レール固有のものにしました。

module AdditionalMethods

  module Shortener
    def short_id
      self.id.base62_encode
    end
    def self.included(base)
      base.extend(ClassMethods)
    end
    module ClassMethods
      def original_id(string)
        string.base62_decode
      end
      def find_by_short_id(string)
        self.find_by_id(self.original_id(string))
      end
    end
  end

end

Post.rb

class Post < ActiveRecord::Base
  include AdditionalMethods::Shortener
  ...
end

それで

>> @post.id
=> 52
>> @post.short_id
=> "q"
>> Post.original_id("q")
=> 52
>> Post.find_by_short_id("q")
=> #<Post id: 52 ... >
于 2013-10-16T06:19:22.187 に答える