4

作成中の Rails アプリのバックエンドとして MongoDB を使用しています。Mongo はデフォルトで、レコードの 24 文字の 16 進数 ID を生成してシャーディングを容易にするため、私の URL は次のようになります。

example.com/companies/4b3fc1400de0690bf2000001/employees/4b3ea6e30de0691552000001

これはあまりきれいではありません。Rails の URL 規則に固執したいのですが、これらの ID はデータベースにそのまま残します。これらの 16 進 ID をより多くの文字を使用して短いコレクションに圧縮することは、次のようになるため、満足のいく妥協案になると思います。

example.com/companies/3ewqkvr5nj/employees/9srbsjlb2r

次に、コントローラーで圧縮を逆にし、元の 16 進 ID を取得し、それを使用してレコードを検索します。

私の質問は、これらの ID を前後に変換する最良の方法は何ですか? もちろん、できるだけ短くしたいのですが、URLセーフで変換が簡単です。

ありがとう!

4

3 に答える 3

6

16文字列表現を短くするために、より高い基数で 16 進数の ID を表すことができます。Ruby には、2から36.

b36 = '4b3fc1400de0690bf2000001'.hex.to_s(36)
# => "29a6dblglcujcoeboqp"

これを 24 文字の文字列に戻すには、次のようにします。

'%024x' % b36.to_i(36)
# => "4b3fc1400de0690bf2000001"

より良い「圧縮」を実現するには、id を base より高い値で表すことができます36。それを支援するRubyライブラリがあります。all-your-basegem はそのようなライブラリの 1 つです。

、および文字62のみを使用するため、基本表現をお勧めします。これは、デフォルトで URL セーフであることを意味します。0-9a-zA-Z

于 2010-01-03T03:12:05.197 に答える
1

Base 62 表現を使用しても、扱いにくい 16 文字の ID になります。

'4b3fc1400de0690bf2000001'.hex.to_base_62  
# => "UHpdfMzq7jKLcvyr"

Rails の規則を少し回避します。もう 1 つの妥協点はcreated_at、オブジェクトの日付の base 32 表現を「URL ID」として使用することです。

aCompany.created_at
# => Sat Aug 13 20:05:35 -0500 2011
aCompany.created_at.to_i.to_s(32)
# => "174e7qv"

このようにして、特別な目的の属性を追跡する必要なく、非常に短い ID (7 文字) を取得できます (MongoMapper では、自動化された属性を取得するためにモデルに追加するtimestamps!だけです)。created_atupdated_at

于 2011-08-14T01:16:07.400 に答える
0

base64 を使用して短くすることができます。「+」と「/」の代わりに「-」と「_」を使用していることを確認してください。パディング = を切り刻むこともできます。

16 進値から base 64 に変換するコード

def MD5hex2base64(str)
  h1=[].clear

  # split the 32 byte hex into a 16 byte array
  16.times{ h1.push(str.slice!(0,2).hex) }
  # pack (C* = unsigned char), (m = base64 encoded output)
  [h1.pack("C*")].pack("m")
end
于 2010-01-02T23:14:51.470 に答える