私はオブジェクトのIDをより小さな文字列にエンコードする方法と、それをもう一度デコードする方法を探しています。RubyのMongoDBオブジェクトIDを圧縮する
は基本的に私はこれを行うにはどの宝石があり、たとえばID「47cc67093475061e3d95369d」「adff232」のようなものに変身する... bit.ly a'laなど
をしたいですか?
ありがとうございます!
私はオブジェクトのIDをより小さな文字列にエンコードする方法と、それをもう一度デコードする方法を探しています。RubyのMongoDBオブジェクトIDを圧縮する
は基本的に私はこれを行うにはどの宝石があり、たとえばID「47cc67093475061e3d95369d」「adff232」のようなものに変身する... bit.ly a'laなど
をしたいですか?
ありがとうございます!
base62エンコーディングを使用してください。そこいくつかの宝石がありますが、それはのように単純でなければなりません:あなたの例の場合
id.to_s.to_i(16).base62_encode
、あなたの出力はsTIRzdDETzTR6YOh
だろう。
あなたが圧縮された文字列を表示する予定がない場合は、あなたがpack
とunpack
で半分に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
ありがとう!それ以外の方法はどうですか? sTIRzdDETzTR6YOhから47cc67093475061e3d95369dに? – Erik
検索エンジンは大文字と小文字を区別しないので、ベース62に注意する必要があります。 – khelll
URLに使用できる新しい一意のフィールドを追加することでこれを解決する別の方法を使用しました:rand(Time.now.to_i).to_s(36) – khelll