5

次のようなbit.lyURLと同じスタイルのUUIDを生成しようとしています。

http://bit [dot] ly/aUekJP

またはcloudappのもの:

http://cl [dot] ly/1hVU

さらに小さい

どうすればいいですか?現在、ルビーにUUID gemを使用していますが、長さを制限してこのようなものを取得できるかどうかはわかりません。私は現在これを使用しています:

UUID.generate.split("-")[0] => b9386070

しかし、私はもっと小さくして、それがユニークになることを知っていたいです。

どんな助けでも大歓迎です:)


編集メモ:禁止された短いリンク[dot]の回避策のためにドット文字をに置き換えました

4

4 に答える 4

15

ここでは、2つの異なることを混同しています。UUIDは、ユニバーサルに一意の識別子です。たとえ世界中で何百万ものそれらが同時に作成されていたとしても、それはユニークである可能性が非常に高いです。通常、36桁の文字列として表示されます。最初の8文字を切り取って、それが一意であると期待することはできません。

ちなみに、tinyurl et-alはリンクを保存し、そのリンクを表す短いコードを生成します。データストアで検索したコードからURLを再構築せず、対応するURLを返します。これらはUUIDではありません。

アプリケーションを知らなければ、どの方法を使用すべきかをアドバイスするのは難しいですが、データストアに数字キーを使用してポイントしているものをすべて保存し、10桁と22文字の小文字を使用してキーをbase32にリベースすることができます。おそらく'o''i''l'などの明らかなタイプミスの問題を回避する

編集

さらに調査すると、 DouglasCrockfordのBase32実装を実装するRubybase32gemが利用可能です。

5文字のBase32文字列は、3,300万を超える整数を表し、6桁の文字列は10億を超える文字列を表すことができます。

于 2010-07-19T15:05:28.670 に答える
10

数値を扱う場合は、組み込みのrubyメソッドを使用できます

6175601989.to_s(30)
 => "8e45ttj" 

戻る

"8e45ttj".to_i(30)
=>6175601989

したがって、何も保存する必要はなく、着信するshort_codeをいつでもデコードできます。

これは概念実証には問題なく機能しますが、1lji0oのようなあいまいな文字を避けることはできません。コードを使用してデータベースレコードIDを難読化することだけを検討している場合は、これで問題なく機能します。一般に、ショートコードは、誰かのプレゼンテーションスライドで読んだり、電話で聞いたりするなど、覚えやすく、あるメディアから別のメディアに転送できると考えられています。読みにくい、または「聞き取りにくい」文字を避ける必要がある場合は、受け入れ可能なコードを生成して保存するプロセスに切り替える必要がある場合があります。

于 2012-09-18T15:16:11.993 に答える
0

私はこれが短くて信頼できることを発見しました:

def create_uuid(prefix=nil)
  time   = (Time.now.to_f * 10_000_000).to_i
  jitter = rand(10_000_000) 
  key    = "#{jitter}#{time}".to_i.to_s(36)
  [prefix, key].compact.join('_')
end

これにより、次のような一意のキーが出力されます。'3qaishe3gpp07w2m '
'ジッター'サイズを小さくして、キーサイズを小さくします。

警告: これは一意であることが保証されていません(そのためにはSecureRandom.uuidを使用してください)が、信頼性は高いです:

10_000_000.times.map {create_uuid}.uniq.length == 10_000_000
于 2013-12-23T17:13:36.173 に答える
-12

一意性を保証する唯一の方法は、グローバルカウントを保持し、使用ごとにインクリメントすることです:00000001など。

于 2010-07-19T14:48:04.547 に答える