在小写字母中生成带字母和数字的唯一随机字符串

时间:2011-05-11 15:38:27

标签: ruby ruby-on-rails-3

如何修复此代码,以便以小写形式生成唯一的随机字母和数字?

api_string = (0...32).map{65.+(rand(25)).chr}.join    

目前,它只生成字母。

11 个答案:

答案 0 :(得分:83)

如果您使用的是ruby 1.9.2,则可以使用SecureRandom:

irb(main):001:0> require 'securerandom'
=> true
irb(main):002:0> SecureRandom.hex(13)
=> "5bbf194bcf8740ae8c9ce49e97"
irb(main):003:0> SecureRandom.hex(15)
=> "d2413503a9618bacfdb1745eafdb0f"
irb(main):004:0> SecureRandom.hex(32)
=> "432e0a359bbf3669e6da610d57ea5d0cd9e2fceb93e7f7989305d89e31073690"

答案 1 :(得分:26)

所有字母和数字,这是数字在基数36中的表示方式。

api_string = Array.new(32){rand(36).to_s(36)}.join

答案 2 :(得分:16)

8.times.map { [*'0'..'9', *'a'..'z'].sample }.join

答案 3 :(得分:2)

这是一种方法:

POSSIBLE = (('A'..'Z').to_a + (0..9).to_a)
api_string = (0...32).map { |n| POSSIBLE.sample }.join

如果您有Active Support,您也可以这样做以创建类似API键的字符串:

ActiveSupport::SecureRandom.hex(32)

答案 4 :(得分:2)

我忘记了从哪里来,但我今天早上以某种方式阅读了这个

l,m = 24,36
rand(m**l).to_s(m).rjust(l,'0')

它创建从0到幂(36,24)的随机数,然后将其转换为base-36字符串(即0-9和a-z)

答案 5 :(得分:1)

CHARS = (?0..?9).to_a + (?a..?z).to_a
api_string = 32.times.inject("") {|s, i| s << CHARS[rand(CHARS.size)]}

答案 6 :(得分:1)

((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join

rand(100)替换为rand(n),其中n是所需字符串的最大长度。

答案 7 :(得分:1)

这将生成一个较低的随机字符串,其长度为32至50个字符,包括数字和字母,两者均是

class GradientBackgroundView: CAGradientLayer {

    override init() {
        super.init()
        setupGradientLayer()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    fileprivate func setupGradientLayer() -> Void {

        self.colors = ["226320","256c23","39a636","267024"].map({ hex -> CGColor in
            return UIColor.hexStringToUIColor(hex: hex).cgColor
        })

        self.calculatePoints(for: 45)
    }
}

答案 8 :(得分:0)

使用ruby语言的SecureRandom。

require 'securerandom' randomstring = SecureRandom.hex(5)

它将生成包含“0-9”和“a-f”

的n * 2随机字符串

答案 9 :(得分:0)

较新版本的Ruby支持SecureRandom.base58,它将为您提供比十六进制更密集的令牌,而无需任何特殊字符。

> SecureRandom.base58(24)
> "Zp9N4aYvQfz3E6CmEzkadoa2" 

答案 10 :(得分:-1)

Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)