ActiveSupport::SecureRandom
class\libraryについて質問があります。
http://apidock.com/rails/ActiveSupport/SecureRandom
によって生成されたようなランダムトークンを必要とする可能性のあるアプリケーションを作成していSecureRandom
ます。
これらのトークンの一意性はどうですか?これらのトークンは本質的に一意ですか、それともDB列に一意制約を使用する方がよいでしょうか?
ありがとう!
ActiveSupport::SecureRandom
class\libraryについて質問があります。
http://apidock.com/rails/ActiveSupport/SecureRandom
によって生成されたようなランダムトークンを必要とする可能性のあるアプリケーションを作成していSecureRandom
ます。
これらのトークンの一意性はどうですか?これらのトークンは本質的に一意ですか、それともDB列に一意制約を使用する方がよいでしょうか?
ありがとう!
リンクしたページに注意してください。このモジュールは、インターフェース(および少なくとも1つの特定のバージョンの場合は実装)でhttp://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandomにあるものと一致します。あなたはより多くの詳細を見つけることができます。
このような呼び出しの結果には、固有の一意性はありません。もちろん、システムが適切にシードされ、主張されているように疑似ランダムであることを考えると、衝突の可能性は、組み合わせ論によって示唆されるのと同じくらい小さいはずです。これは「誕生日のパラドックス」であり、特に衝突の可能性は「誕生日攻撃」の成功の可能性に対応します(http://en.wikipedia.org/wiki/Birthday_attack)。詳細については、ウィキペディア。実用的な疑似ランダム性が厳密な保証を与えることは言うまでもありませんが、それに近づくと信じられています。
特に一意性が必要な場合は、これを自分で実施する必要があります。これは簡単なことではなく、期待する条件を達成していることに注意する必要があります。また、すべての可能性をカバーしていることを確認する必要があります。また、比較的まれなケースですが、重複トークンを生成した場合は、それを処理できることを確認する必要があります。
ActiveSupport::SecureRandom
(非推奨)を使用するべきではありません。Rubyのものを使用してください。SecureRandom
とはいえ、もちろんそれらは一意ではありませんが、それほど重要ではありません。モデルで完全に一意のuidを生成する必要がある場合は、次のコードのバリエーションを使用できます。
before_create :generate_uid
def generate_uid
begin
uid = SecureRandom.hex(12)
end while SomeModel.where(:uid => uid).exists?
self.uid = uid
end