【发布时间】: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
【问题讨论】:
如何生成仅包含 A-Z、0-9(如 SecureRandom.base64)而没有 "+"、"/" 和 "=" 的 n 字符伪随机字符串?例如:
(0..n).map {(('1'..'9').to_a + ('A'..'Z').to_a)[rand(36)]}.join
【问题讨论】:
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join
【讨论】:
.sample 做[rand(36)] 吗?
sample 更优雅,如果被采样的数组大小发生变化,则无需更改。
[rand(36)] 超过sample?
在 Rails 5 中实现它的一种优雅方式(我不在其他 Rails 版本中测试它):
SecureRandom.urlsafe_base64(n)
其中n 是您想要的位数。
ps:SecureRandom 使用数组来挂载您的字母数字字符串,因此请记住 n 应该是您想要的位数 + 1。
例如:如果您想要 8 位字母数字:
SecureRandom.urlsafe_base64(9)
【讨论】:
即使是蛮力也很容易:
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 的回答中看到这可以简化很多。)
【讨论】:
要生成 10 到 20 个字符的随机字符串,包括从 A 到 Z 和数字,总是:
require 'string_pattern'
puts "10-20:/XN/".gen
【讨论】:
你可以像下面这样简单地做:
[*'A'..'Z', *0..9].sample(10).join
将数字 10 更改为任意数字以更改字符串的长度
【讨论】: