web-dev-qa-db-ja.com

RubyでのGUIDの生成

Guidsで本当に簡単に解決できる問題があります。

特に、パスワードリセットワークフローの場合、Guidトークンをユーザーのメールに送信し、トークンを使用してパスワードをリセットするようにします。 guidは一意であるため、これは非常に安全であり、ユーザーのパスワードをメールで送信する必要がありません。

Rubyには Guid gem が1つあることに気付きました。しかし、かなり古く見え、ファイルシステムにデータを書き込みます。

誰もがグローバルに一意の識別子を作成できる他の宝石を知っていますか?

私はちょうどにフォールバックできることを知っています:

(0..16).to_a.map{|a| Rand(16).to_s(16)}.join 

しかし、実際には適切なGUID ...

124
Sam Saffron

Ruby 1.9の時点で、uuid生成が組み込まれています。 SecureRandom.uuid 関数。

例えば:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
275
J _

Rubyで小さくてユニークなトークンを作成する方法

>> require 'digest'
=> []
>> Digest::SHA1.hexdigest("some-random-string")[8..16]
=> "2ebe5597f"

>> SecureRandom.base64(8).gsub("/","_").gsub(/=+$/,"")
=> "AEWQyovNFo0" 

>> Rand(36**8).to_s(36)
=> "uur0cj2h"
36
Simone Carletti

IDTools を使用しますが、問題はありません。

35
Avdi

IDTools を見ましたか?

UUIDToolsは、さまざまな種類のUUID(または、それらを呼び出す場合はGUID)を生成するためのシンプルなライブラリになるように設計されました。可能な限り、RFC 4122に準拠しています。

21
Andrew Hare

Googleは次のRubyライブラリを生成します:

http://raa.Ruby-lang.org/project/Ruby-guid/

また、 http://www.Ruby-forum.com/topic/99262 では、gemをインストールできると言っています(コマンドラインでgem uuidを実行してインストールします)。行う

gem 'uuid'
puts UUID.new

コード内で新しいUUIDを確認します。

(ヒント:Googleでguid Ruby

16
Marc W

Simone Carlettiの回答の小さな更新:

SecureRandom.base64(8).gsub( "/"、 "_")。gsub(/ = + $ /、 "")

=> "AEWQyovNFo0"

次のものに置き換えることができます。

SecureRandom.urlsafe_base64(8)

適切なmysql、varchar 32 GUIDを作成するには

SecureRandom.uuid.gsub('-','').upcase
2
Aaron Henderson

深夜にプログラミングをしているときに、Railsで一意のGUID=を生成するための次のソリューション(Simoneに基づいています)。

while Order.find_by_guid(guid = Rand(36**8).to_s(36).upcase).present?; end
1
robotmay

この質問で推奨されているuuid gemを使用した場合、誰もユニークでランダムなUUIDを生成できません。私の答えは回避策です。リクエストを満たすために後でgemを使用する場合は、Rubyでgemを使用することをお勧めします。

私はこの質問で最も推奨されるuuid gemを試してみましたが、誰も私を満足させません。ユニークでランダムなuuidが必要です。 Rubyでシステムコマンドuuidgenを直接実行し、結果が気に入ったので、ここで共有します。

puts `uuidgen`
8adea17d-b918-43e0-b82f-f81b3029f688
puts `uuidgen`
6a4adcce-8f64-41eb-bd7e-e65ee6d11231
puts `uuidgen`
51d5348b-8fc3-4c44-a6f7-9a8588d7f08a
puts `uuidgen`
332a0fa3-7b07-41e1-9fc8-ef804a377e4e

uuid gemと比較すると、違いがわかります。

irb(main):003:0> uuid.generate
=> "40cdf890-ebf5-0132-2250-20c9d088be77"
irb(main):004:0> uuid.generate
=> "4161ac40-ebf5-0132-2250-20c9d088be77"

テスト環境は、LinuxおよびMac OS環境です。

0
BMW

これは私がJavaScriptから学んだニートテクニックです。

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[Rand(36)]
    end
end

より「ルビーの方法」ではありますが、次のこともできます。

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        Rand(16).to_s(16)
    end
end
0
Sancarn