【问题标题】:Generate pseudo random string A-Z, 0-9生成伪随机字符串 A-Z, 0-9
【发布时间】:2014-11-22 10:27:44
【问题描述】:

如何生成仅包含 A-Z、0-9(如 SecureRandom.base64)而没有 "+"、"/" 和 "=" 的 n 字符伪随机字符串?例如:

(0..n).map {(('1'..'9').to_a + ('A'..'Z').to_a)[rand(36)]}.join

【问题讨论】:

    标签: ruby random


    【解决方案1】:
    Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
    

    【讨论】:

    • 好奇心,有什么理由比.sample 做[rand(36)] 吗?
    • 我可以想到一对:sample 更优雅,如果被采样的数组大小发生变化,则无需更改。
    • 好奇心,有什么理由让[rand(36)] 超过sample?
    【解决方案2】:

    在 Rails 5 中实现它的一种优雅方式(我不在其他 Rails 版本中测试它):

    SecureRandom.urlsafe_base64(n)
    

    其中n 是您想要的位数。

    ps:SecureRandom 使用数组来挂载您的字母数字字符串,因此请记住 n 应该是您想要的位数 + 1。

    例如:如果您想要 8 位字母数字:

    SecureRandom.urlsafe_base64(9)
    

    【讨论】:

      【解决方案3】:

      即使是蛮力也很容易:

      n = 20
      
      c = [*?A..?Z + *?0..?9]
      size = c.size
      n.times.map { c[rand(size)] }.join
        #=> "IE210UOTDSJDKM67XCG1"
      

      或者,无需替换:

      c.sample(n).join
        #=> "GN5ZC0HFDCO2G5M47VYW"
      

      这应该是需要的。 (我最初有c = [*(?A..?Z)] + [*(?0..?9)],但从@sawa 的回答中看到这可以简化很多。)

      【讨论】:

        【解决方案4】:

        要生成 10 到 20 个字符的随机字符串,包括从 A 到 Z 和数字,总是:

        require 'string_pattern'
        
        puts "10-20:/XN/".gen
        

        【讨论】:

          【解决方案5】:

          你可以像下面这样简单地做:

          [*'A'..'Z', *0..9].sample(10).join
          

          将数字 10 更改为任意数字以更改字符串的长度

          【讨论】:

            猜你喜欢
            • 2011-03-08
            • 1970-01-01
            • 2015-07-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-08
            • 2013-12-30
            • 2013-10-10
            相关资源
            最近更新 更多