Jef*_*eff 729 ruby random passwords
我正在为"A"生成一个8个字符的伪随机大写字符串."Z":
value = ""; 8.times{value << (65 + rand(25)).chr}
Run Code Online (Sandbox Code Playgroud)
但它看起来并不干净,并且它不能作为参数传递,因为它不是单个语句.要获得一个混合大小写的字符串"a".."z"加上"A".."Z",我将其更改为:
value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr}
Run Code Online (Sandbox Code Playgroud)
但它看起来像垃圾.
有没有人有更好的方法?
Ken*_*ric 945
(0...8).map { (65 + rand(26)).chr }.join
Run Code Online (Sandbox Code Playgroud)
我花太多时间打高尔夫球.
(0...50).map { ('a'..'z').to_a[rand(26)] }.join
Run Code Online (Sandbox Code Playgroud)
而最后一个更令人困惑,但更灵活,浪费更少的周期:
o = [('a'..'z'), ('A'..'Z')].map(&:to_a).flatten
string = (0...50).map { o[rand(o.length)] }.join
Run Code Online (Sandbox Code Playgroud)
小智 784
为什么不使用SecureRandom?
require 'securerandom'
random_string = SecureRandom.hex
# outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (i.e. 32 chars of 0..9, a..f)
Run Code Online (Sandbox Code Playgroud)
SecureRandom还有以下方法:
请参阅:http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html
小智 245
我使用它来生成具有保证最大长度的随机URL友好字符串:
rand(36**length).to_s(36)
Run Code Online (Sandbox Code Playgroud)
它生成小写az和0-9的随机字符串.它不是很可定制,但它简洁干净.
小智 171
该解决方案为激活码生成一串易于阅读的字符; 我不希望人们混淆8与B,1与I,0与O,L与1混淆等.
# Generates a random string from a set of easily readable characters
def generate_activation_code(size = 6)
charset = %w{ 2 3 4 6 7 9 A C D E F G H J K M N P Q R T V W X Y Z}
(0...size).map{ charset.to_a[rand(charset.size)] }.join
end
Run Code Online (Sandbox Code Playgroud)
Tra*_*der 127
其他人提到类似的东西,但这使用了URL安全功能.
require 'securerandom'
p SecureRandom.urlsafe_base64(5) #=> "UtM7aa8"
p SecureRandom.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg"
p SecureRandom.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ=="
Run Code Online (Sandbox Code Playgroud)
结果可能包含AZ,az,0-9," - "和"_".如果填充为真,则也使用"=".
Mar*_*kus 58
由于ruby 2.5非常容易搭配SecureRandom.alphanumeric:
len = 8
SecureRandom.alphanumeric(len)
=> "larHSsgL"
Run Code Online (Sandbox Code Playgroud)
生成包含AZ,az和0-9的随机字符串,因此应适用于大多数用例.并且它们是随机生成的,这也可能是一个好处.
编辑:将其与具有最多投票的解决方案进行比较的基准:
require 'benchmark'
require 'securerandom'
len = 10
n = 100_000
Benchmark.bm(12) do |x|
x.report('SecureRandom') { n.times { SecureRandom.alphanumeric(len) } }
x.report('rand') do
o = [('a'..'z'), ('A'..'Z'), (0..9)].map(&:to_a).flatten
n.times { (0...len).map { o[rand(o.length)] }.join }
end
end
Run Code Online (Sandbox Code Playgroud)
user system total real
SecureRandom 0.429442 0.002746 0.432188 ( 0.432705)
rand 0.306650 0.000716 0.307366 ( 0.307745)
Run Code Online (Sandbox Code Playgroud)
所以rand解决方案只需要大约3/4的时间SecureRandom.如果你生成了很多字符串可能很重要,但如果你不时创建一些随机字符串,我总是会使用更安全的实现(因为它也更容易调用和更明确).
Sha*_*man 47
[*('A'..'Z')].sample(8).join
Run Code Online (Sandbox Code Playgroud)
生成一个随机的8个字母的字符串(例如NVAYXHGR)
([*('A'..'Z'),*('0'..'9')]-%w(0 1 I O)).sample(8).join
Run Code Online (Sandbox Code Playgroud)
生成随机8字符串(例如3PH4SWF2),不包括0/1/I/O. Ruby 1.9
Tra*_*der 30
我不记得我发现了什么,但对我来说似乎是最好的,也是最不重要的过程:
def random_string(length=10)
chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789'
password = ''
length.times { password << chars[rand(chars.size)] }
password
end
Run Code Online (Sandbox Code Playgroud)
小智 27
require 'securerandom'
SecureRandom.urlsafe_base64(9)
Run Code Online (Sandbox Code Playgroud)
小智 25
如果需要指定长度的字符串,请使用:
require 'securerandom'
randomstring = SecureRandom.hex(n)
Run Code Online (Sandbox Code Playgroud)
它将生成一个2n包含0-9和的随机字符串长度a-f
小智 11
require 'sha1'
srand
seed = "--#{rand(10000)}--#{Time.now}--"
Digest::SHA1.hexdigest(seed)[0,8]
Run Code Online (Sandbox Code Playgroud)
Rag*_*nir 10
Ruby 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"
Run Code Online (Sandbox Code Playgroud)
Awa*_*ais 10
这是一行长度为8的随机字符串简单代码
random_string = ('0'..'z').to_a.shuffle.first(8).join
Run Code Online (Sandbox Code Playgroud)
您也可以将它用于长度为8的随机密码
random_password = ('0'..'z').to_a.shuffle.first(8).join
Run Code Online (Sandbox Code Playgroud)
我希望它会有所帮助和惊人.
这是一个简单的随机密码代码,带有lenth 8
rand_password=('0'..'z').to_a.shuffle.first(8).join
Run Code Online (Sandbox Code Playgroud)
希望它会有所帮助.
请注意: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
Run Code Online (Sandbox Code Playgroud)
我喜欢使用的另一种方法
rand(2**256).to_s(36)[0..7]
Run Code Online (Sandbox Code Playgroud)
如果您对正确的字符串长度非常偏执,请添加:
rand(2**256).to_s(36).ljust(8,'a')[0..7]
Run Code Online (Sandbox Code Playgroud)
SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')
Run Code Online (Sandbox Code Playgroud)
来自Devise的东西
我认为这是简洁,清晰和易于修改的良好平衡.
characters = ('a'..'z').to_a + ('A'..'Z').to_a
# Prior to 1.9, use .choice, not .sample
(0..8).map{characters.sample}.join
Run Code Online (Sandbox Code Playgroud)
例如,包括数字:
characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a
Run Code Online (Sandbox Code Playgroud)
大写十六进制:
characters = ('A'..'F').to_a + (0..9).to_a
Run Code Online (Sandbox Code Playgroud)
对于真正令人印象深刻的人物阵列:
characters = (32..126).to_a.pack('U*').chars.to_a
Run Code Online (Sandbox Code Playgroud)
在这里加我的分钱......
def random_string(length = 8)
rand(32**length).to_s(32)
end
Run Code Online (Sandbox Code Playgroud)
你可以使用String#randomRuby Gem的Facets facets:
它基本上是这样的:
class String
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
characters = character_set.map { |i| i.to_a }.flatten
characters_len = characters.length
(0...len).map{ characters[rand(characters_len)] }.join
end
end
Run Code Online (Sandbox Code Playgroud)