【问题标题】:ActiveSupport::SecureRandom.hex question? Rails and RubyActiveSupport::SecureRandom.hex 问题? Rails 和 Ruby
【发布时间】:2011-09-07 19:20:05
【问题描述】:

我有一个关于 ActiveSupport::SecureRandom 类\库的问题。

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

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

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby rubygems activesupport


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-14
        • 2011-06-22
        相关资源
        最近更新 更多