3

我有一个关于ActiveSupport::SecureRandom类\图书馆的问题。

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

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

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

谢谢!

4

2 回答 2

4

请注意您链接的页面,该页面表示此模块在接口(和实现,至少在一个特定版本的情况下)与http://rubydoc.info/stdlib/securerandom/1.9.2/SecureRandom中的那个匹配你可以找到更多细节。

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

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

于 2011-09-07T19:34:57.123 回答
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
于 2012-12-17T17:48:18.203 回答