我目前正在为“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}

但它看起来像垃圾。

有人有更好的方法吗?


当前回答

下面是另一种方法:

它使用安全随机数生成器而不是rand()可用于URL和文件名包含大写、小写字符和数字具有不包含不明确字符I0l01的选项

需要“安全”

def secure_random_string(length = 32, non_ambiguous = false)
  characters = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a

  %w{I O l 0 1}.each{ |ambiguous_character| 
    characters.delete ambiguous_character 
  } if non_ambiguous

  (0...length).map{
    characters[ActiveSupport::SecureRandom.random_number(characters.size)]
  }.join
end

其他回答

SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz')

来自Devise的东西

对于devicesecure_validable,您可以使用

(0...8).map { ([65, 97].sample + rand(26)).chr }.push(rand(99)).join

如果需要指定长度的字符串,请使用:

require 'securerandom'
randomstring = SecureRandom.hex(n)

它将生成长度为2n的随机字符串,包含0-9和a-f

我不知道ruby,所以我不能给你确切的语法,但我会用可接受的字符列表设置一个常量字符串,然后使用子字符串运算符从中选择一个随机字符。

这里的优点是,如果字符串应该是用户可输入的,那么可以排除容易混淆的字符,如l和1以及i、0和O、5和S等。

我们一直在代码中使用这个:

class String

  def self.random(length=10)
    ('a'..'z').sort_by {rand}[0,length].join
  end

end

支持的最大长度是25(无论如何,我们只在默认情况下使用它,所以这不是问题)。

有人提到“…”如果你想完全避免产生冒犯性的词语,z是次优的。我们的一个想法是去掉元音,但你最终还是会得到WTFBBQ等。