有没有更快的方法在ruby中生成随机字符串?

有没有更快的方法在ruby中生成随机字符串?,ruby,Ruby,235秒 有没有更快的方法在ruby中生成随机字符串?不需要执行36**1024 1000000次 这肯定会节省一些时间不需要做36**1024 1000000次 这肯定会节省一些时间您可以洗牌字符串以获得随机字符串 val=36**1024 1000000.times do rand(val).to_s(36) end =>126秒您可以洗牌字符串以获得随机字符串 val=36**1024 1000000.times do rand(val).to_s(36) end =>126秒

235秒

有没有更快的方法在ruby中生成随机字符串?

不需要执行36**1024 1000000次

这肯定会节省一些时间

不需要做36**1024 1000000次


这肯定会节省一些时间

您可以洗牌字符串以获得随机字符串

val=36**1024
1000000.times do
  rand(val).to_s(36)
end

=>126秒

您可以洗牌字符串以获得随机字符串

val=36**1024
1000000.times do
  rand(val).to_s(36)
end

=>126秒

使用securerandom怎么样

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

使用securerandom怎么样

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
如果目标系统具有/dev/uradom,则可以从中随机读取字节。它应该更快。下面是带有基准测试的代码。一些Ruby库使用这种方法来生成随机的东西

require 'securerandom'

start_time = Time.now
1000000 .times do
  SecureRandom.base64(1024)
end
end_time = Time.now
puts end_time - start_time
在这里,您可以看到100000、1024个字符长的随机字符串的基准测试结果

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
如果目标系统具有/dev/uradom,则可以从中随机读取字节。它应该更快。下面是带有基准测试的代码。一些Ruby库使用这种方法来生成随机的东西

require 'securerandom'

start_time = Time.now
1000000 .times do
  SecureRandom.base64(1024)
end
end_time = Time.now
puts end_time - start_time
在这里,您可以看到100000、1024个字符长的随机字符串的基准测试结果

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
=>1.8秒

简而言之,Object.new.hash.to_

=>1.8秒


简而言之,Object.new.hash.to_s

您在这里有点作弊,因为您在计时循环之外执行了大部分实际随机化。您在这里有点作弊,因为您在计时循环之外执行了大部分实际随机化。旁注:使用。要求“基准”;Benchmark.measure{1000000.times{rand36**1024.to_s36}}。旁注:使用。要求“基准”;Benchmark.measure{1000000.times{rand36**1024.to_s36}}。我喜欢你的想法,但是第二个基准中的big_key=f.readpartial512.unpach*[0]行只执行一次。您应该使用与第一种情况相同的度量方法,即100000.times,然后重新运行基准测试。想法是从/dev/uradom读取数据,直到获得足够的随机字节。我明白了,但您的代码总共读取512字节,而不是10000*512字节。您正在对单个执行而不是10k执行进行基准测试。我喜欢您的想法,但是第二个基准测试中的big_key=f.readpartial512.unpach*[0]行只执行一次。您应该使用与第一种情况相同的度量方法,即100000.times,然后重新运行基准测试。想法是从/dev/uradom读取数据,直到获得足够的随机字节。我明白了,但您的代码总共读取512字节,而不是10000*512字节。您正在对单个执行进行基准测试,而不是对10k个执行进行基准测试。XD不能。。。在下面standddobject.new.hash.to_注释。XD不能。。。在下面standddobject.new.hash.to_