我目前正在为“A”生成一个8字符伪随机大写字符串。。“Z”:
value = ""; 8.times{value << (65 + rand(25)).chr}
但它看起来不干净,而且不能作为参数传递,因为它不是一个单独的语句。要获取混合大小写字符串“a”。。“z”加“A”。。“Z”,我将其更改为:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
但它看起来像垃圾。
有人有更好的方法吗?
我目前正在为“A”生成一个8字符伪随机大写字符串。。“Z”:
value = ""; 8.times{value << (65 + rand(25)).chr}
但它看起来不干净,而且不能作为参数传递,因为它不是一个单独的语句。要获取混合大小写字符串“a”。。“z”加“A”。。“Z”,我将其更改为:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
但它看起来像垃圾。
有人有更好的方法吗?
当前回答
红宝石1.9+:
ALPHABET = ('a'..'z').to_a
#=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"]
10.times.map { ALPHABET.sample }.join
#=> "stkbssowre"
# or
10.times.inject('') { |s| s + ALPHABET.sample }
#=> "fdgvacnxhc"
其他回答
以下是长度为8的随机字符串的一行简单代码:
random_string = ('0'..'z').to_a.shuffle.first(8).join
您也可以将其用于长度为8的随机密码:
random_password = ('0'..'z').to_a.shuffle.first(8).join
我喜欢使用的另一种方法:
rand(2**256).to_s(36)[0..7]
如果您真的对正确的字符串长度有疑问,请添加ljust:
rand(2**256).to_s(36).ljust(8,'a')[0..7]
使用此方法,您可以传入一个很短的长度。默认设置为6。
def generate_random_string(length=6)
string = ""
chars = ("A".."Z").to_a
length.times do
string << chars[rand(chars.length-1)]
end
string
end
试试这个
def rand_name(len=9)
ary = [('0'..'9').to_a, ('a'..'z').to_a, ('A'..'Z').to_a]
name = ''
len.times do
name << ary.choice.choice
end
name
end
我喜欢这条线索的答案,真的很有帮助!,但如果我可以说,它们中没有一个满足我的愿望,可能是rand()方法。我觉得这不太对,因为我们已经有了Array#choice方法。
请注意:rand对于攻击者来说是可预测的,因此可能不安全。如果这是用于生成密码的,则绝对应该使用SecureRandom。我用的是这样的东西:
length = 10
characters = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a
password = SecureRandom.random_bytes(length).each_char.map do |char|
characters[(char.ord % characters.length)]
end.join