生成伪随机字符串 A-Z, 0-9

4

如何生成一个只包含 A-Z, 0-9 字符的长度为n的伪随机字符串,类似于SecureRandom.base64,但不包含字符"+""/""="?例如:

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

17
Array.new(n){[*"A".."Z", *"0".."9"].sample}.join

有什么好奇心,任何理由用 .sample 还是 [rand(36)] - gr8scott06
2
我可以想到几个:sample 更加优雅,并且如果被取样的数组大小发生变化,它无需改动。 - Cary Swoveland
2
好奇心,为什么要使用[rand(36)]而不是sample - sawa

4
在Rails 5中,有一种优雅的方法来实现这个(我没有在其他版本的Rails中测试过):
SecureRandom.urlsafe_base64(n)

其中n是您想要的数字的数量。

注:SecureRandom使用数组来生成字母数字字符串,因此请记住,n应该是您想要的数字数量+1

例如:如果您想要一个8位字母数字组合:

SecureRandom.urlsafe_base64(9)

2

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

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

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


1
即使是暴力破解也相当简单:

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的答案中发现可以简化得多。)

0

生成一个随机字符串,长度在10到20个字符之间,只包含大写字母A到Z和数字。

require 'string_pattern'

puts "10-20:/XN/".gen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接