ActiveSupport :: SecureRandom.hex问题? Rails和Ruby

问题描述:

我有一个关于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