我有一個關於ActiveSupport::SecureRandom
class \ library的問題。ActiveSupport :: SecureRandom.hex問題? Rails和Ruby
http://apidock.com/rails/ActiveSupport/SecureRandom
我寫這可能需要一些隨機令牌像由SecureRandom
生成的應用程序。
這些令牌的唯一性如何?這些令牌是否是唯一的,還是應該在我的數據庫列上使用唯一約束更好?
謝謝!
我有一個關於ActiveSupport::SecureRandom
class \ library的問題。ActiveSupport :: SecureRandom.hex問題? Rails和Ruby
http://apidock.com/rails/ActiveSupport/SecureRandom
我寫這可能需要一些隨機令牌像由SecureRandom
生成的應用程序。
這些令牌的唯一性如何?這些令牌是否是唯一的,還是應該在我的數據庫列上使用唯一約束更好?
謝謝!
請注意您鏈接的頁面,該頁面表示此模塊在接口(和實現中,至少在某個特定版本的情況下)與http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom中的頁面相匹配,您可以在其中找到更多詳細信息。
這種調用的結果沒有固有的唯一性。當然,假設系統接收良好並且是僞隨機序列,碰撞的機會應該與組合數據所提示的一樣小。這是「生日悖論」,特別是碰撞的機會與成功的「生日攻擊」(http://en.wikipedia.org/wiki/Birthday_attack)的機會相對應,您可以在維基百科上找到更多詳細信息。並不是說實際的僞隨機性提供了嚴格的保證,但它相信會接近。
如果您特別需要唯一性,您需要自己執行此操作。這不是那麼容易做到的,而且您需要小心以確保達到預期的條件。您還需要確保您覆蓋了所有可能性,並且如果您 - 在相對罕見的情況下 - 生成重複令牌,您可以處理它。
你不應該使用ActiveSupport::SecureRandom
(不建議使用),使用Ruby的一個:SecureRandom
話雖這麼說,當然他們不是唯一的,但它是不是真的很重要:如果你只是需要生成一個完全獨特的您可以使用以下代碼的變體:
before_create :generate_uid
def generate_uid
begin
uid = SecureRandom.hex(12)
end while SomeModel.where(:uid => uid).exists?
self.uid = uid
end