协慌网

登录 贡献 社区

如何在 Ruby 中生成随机字符串

我目前正在为 “A” ..“Z” 生成一个 8 个字符的伪随机大写字符串:

value = ""; 8.times{value  << (65 + rand(25)).chr}

但它看起来不干净,并且由于它不是单个语句,因此不能作为参数传递。为了获得大小写混合的字符串 “a” ..“z” 加上 “A” ..“Z”,我将其更改为:

value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}

但看起来像垃圾

有谁有更好的方法?

答案

(0...8).map { (65 + rand(26)).chr }.join

我花太多时间打高尔夫球。

(0...50).map { ('a'..'z').to_a[rand(26)] }.join

最后一个更令人困惑,但更灵活,浪费的周期更少:

o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join

为什么不使用 SecureRandom?

require 'securerandom'
random_string = SecureRandom.hex

# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)

SecureRandom 还具有以下方法:

  • base64
  • random_bytes
  • random_number

参见: http : //ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html

我使用它来生成具有最大长度保证的随机 URL 友好字符串:

rand(36**length).to_s(36)

它生成小写字母 az 和 0-9 的随机字符串。它不是非常可定制的,但是又短又干净。