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

时间:2011-09-07 19:20:06

标签: ruby-on-rails ruby rubygems activesupport

我对ActiveSupport::SecureRandom class \ library有疑问。

http://apidock.com/rails/ActiveSupport/SecureRandom

我正在编写一个可能需要一些随机令牌的应用程序,例如由SecureRandom生成的令牌。

这些令牌的唯一性如何?这些令牌本质上是唯一的还是我最好在我的数据库列上使用唯一约束?

谢谢!

2 个答案:

答案 0 :(得分:4)

请注意您链接的页面,其中说明此模块在界面(和实现,至少在一个特定版本的情况下)与http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom处的匹配,您可以在其中找到更多详细信息。

此类调用的结果没有固有的唯一性。当然,鉴于系统播种良好且伪随机声称,碰撞的机会应该与组合学所建议的一样小。这就是“生日悖论”,特别是碰撞的几率与成功的“生日攻击”(http://en.wikipedia.org/wiki/Birthday_attack)的机会相对应,你可以在维基百科上找到更多细节。并不是说实际的伪随机性提供了严格的保证,但人们相信它会接近。

如果您特别需要唯一性,则需要自行执行此操作。这不是那么容易做到的,你需要小心你正在达到你期望的条件。您还需要确保覆盖所有可能性,如果您这样做 - 在相对罕见的情况下 - 生成重复令牌,您就可以处理它。

答案 1 :(得分:4)

您不应该使用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