2011-09-07 81 views

回答

3

請注意您鏈接的頁面,該頁面表示此模塊在接口(和實現中,至少在某個特定版本的情況下)與http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom中的頁面相匹配,您可以在其中找到更多詳細信息。

這種調用的結果沒有固有的唯一性。當然,假設系統接收良好並且是僞隨機序列,碰撞的機會應該與組合數據所提示的一樣小。這是「生日悖論」,特別是碰撞的機會與成功的「生日攻擊」(http://en.wikipedia.org/wiki/Birthday_attack)的機會相對應,您可以在維基百科上找到更多詳細信息。並不是說實際的僞隨機性提供了嚴格的保證,但它相信會接近。

如果您特別需要唯一性,您需要自己執行此操作。這不是那麼容易做到的,而且您需要小心以確保達到預期的條件。您還需要確保您覆蓋了所有可能性,並且如果您 - 在相對罕見的情況下 - 生成重複令牌,您可以處理它。

4

你不應該使用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