2011-02-08 8 views
1

私はオブジェクトのIDをより小さな文字列にエンコードする方法と、それをもう一度デコードする方法を探しています。RubyのMongoDBオブジェクトIDを圧縮する

は基本的に私はこれを行うにはどの宝石があり、たとえばID「47cc67093475061e3d95369d」「adff232」のようなものに変身する... bit.ly a'laなど

をしたいですか?

ありがとうございます!

答えて

1

base62エンコーディングを使用してください。そこいくつかの宝石がありますが、それはのように単純でなければなりません:あなたの例の場合

id.to_s.to_i(16).base62_encode 

、あなたの出力はsTIRzdDETzTR6YOhだろう。

+0

ありがとう!それ以外の方法はどうですか? sTIRzdDETzTR6YOhから47cc67093475061e3d95369dに? – Erik

+3

検索エンジンは大文字と小文字を区別しないので、ベース62に注意する必要があります。 – khelll

+0

URLに使用できる新しい一意のフィールドを追加することでこれを解決する別の方法を使用しました:rand(Time.now.to_i).to_s(36) – khelll

0

あなたが圧縮された文字列を表示する予定がない場合は、あなたがpackunpackで半分にidを圧縮することができます。

id = "47cc67093475061e3d95369d" 
puts id.length    #=> 24 

compressed_id = id.to_a.pack('H*') 
p compressed_id   #=> "G\314g\t4u\006\036=\2256\235" 
puts compressed_id.length #=> 12 

uncompressed_id = compressed_id.unpack('H*')[0] 
p uncompressed_id   #=> "47cc67093475061e3d95369d" 
puts uncompressed_id == id #=> true 
関連する問題