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

但它看起来像垃圾。

有人有更好的方法吗?


当前回答

我只是编写了一个小gemrandom_token来为大多数用例生成随机令牌,享受~

https://github.com/sibevin/random_token

其他回答

我不知道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等。

如果您使用的是UNIX,并且仍然必须使用Ruby 1.8(没有SecureRandom)而不使用Rails,那么您也可以使用这个:

random_string = `openssl rand -base64 24`

请注意,这会生成新的shell,这非常慢,只能推荐用于脚本。

下面是一个长度为8的随机密码的简单代码:

rand_password=('0'..'z').to_a.shuffle.first(8).join

Array.new(n){[*“0”..“9”].sample}.join,其中n=8。

广义:Array.new(n){[*“A”..“Z”,*“0”..“9”].sample}.join等。

来自:“生成伪随机字符串A-Z,0-9”。