start_time = Time.now
1000000.times do
rand(36**1024).to_s(36)
end
end_time = Time.now
puts end_time - start_time
235秒。
Rubyでランダムな文字列を生成するより速い方法はありますか?
start_time = Time.now
1000000.times do
rand(36**1024).to_s(36)
end
end_time = Time.now
puts end_time - start_time
235秒。
Rubyでランダムな文字列を生成するより速い方法はありますか?
ターゲット システムに/dev/urandomがある場合、そこからランダムなバイトを読み取ることができます。それはより速いはずです。これがベンチマーク付きのコードです。一部の Ruby ライブラリは、このアプローチを使用してランダムなものを生成します。
Benchmark.bm do|b|
b.report("Ruby #rand ") do
100000.times do
big_key = rand(36**1024).to_s(36)
end
end
b.report("/dev/urandom") do
File.open("/dev/urandom",File::RDONLY || File::NONBLOCK || File::NOCTTY) do |f|
100000.times do
big_key = f.readpartial(512).unpack("H*")[0]
end
end
end
end
ここでは、100000、1024 文字の長いランダム文字列のベンチマーク結果を確認できます...
user system total real
Ruby #rand 31.750000 0.080000 31.830000 ( 32.909136)
/dev/urandom 0.810000 5.870000 6.680000 ( 6.974276)
する必要はありません36**1024
1000000 times
val=36**1024
1000000.times do
rand(val).to_s(36)
end
これは間違いなくいくらかの時間を節約します
セキュアランダムの使用についてはどうですか?
require 'securerandom'
start_time = Time.now
1000000 .times do
SecureRandom.base64(1024)
end
end_time = Time.now
puts end_time - start_time
文字列をシャッフルしてランダムな文字列を取得できます
array = rand(36**1024).to_s(36).split(//)
start_time = Time.now
1000000.times do
array.shuffle.join
end
end_time = Time.now
puts end_time - start_time
#=> 126 秒
1.9.3p194 :113 >
1.9.3p194 :114 > start_time = Time.now
=> 2012-10-16 19:51:45 +0530
1.9.3p194 :115 > 1000000.times do
1.9.3p194 :116 > (Object.new.hash.to_s << Object.new.hash.to_s)[0..35]
1.9.3p194 :117?> end
=> 1000000
1.9.3p194 :118 > end_time = Time.now
=> 2012-10-16 19:51:46 +0530
1.9.3p194 :119 > puts end_time - start_time
1.8252512
=> nil
1.9.3p194 :120 >
=> 1.8秒
要するにObject.new.hash.to_s