生成带有小写字母和数字的唯一随机字符串

Posted

技术标签:

【中文标题】生成带有小写字母和数字的唯一随机字符串【英文标题】:Generate Unique Random String With Letters And Numbers In Lower Case 【发布时间】:2011-08-23 10:34:09 【问题描述】:

如何修复此代码,使其生成唯一的小写随机字母和数字?

api_string = (0...32).map65.+(rand(25)).chr.join    

目前,它只生成字母。

【问题讨论】:

数字的范围是 48 到 57。这些必须包含在您的范围内。 感谢您的回答。你能举个例子让我把它标记为正确吗? How best to generate a random string in Ruby的可能重复 【参考方案1】:

较新版本的 Ruby 支持 SecureRandom.base58,这将获得比十六进制更密集的标记,没有任何特殊字符。

> SecureRandom.base58(24)
> "Zp9N4aYvQfz3E6CmEzkadoa2" 

【讨论】:

这个答案比公认的要好得多。【参考方案2】:

这将生成一个 32 到 50 个字符的较低随机字符串,包括数字和字母:

require 'string_pattern'

puts "32-50:/xN/".gen

【讨论】:

【参考方案3】:
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)

【讨论】:

【参考方案4】:

8.times.map [*'0'..'9', *'a'..'z'].sample .join

【讨论】:

'0'..'9' 生成一个从 0 到 9 的数组,'a'..'z' 生成一个从 a 到 z 的数组,但是它们之前的 * 究竟是做什么的呢? '0'..'9' 是范围,* 是 splat 运算符。它将范围内的元素拆分为作为一个组返回的单个项目,因此基本上* 正在帮助您分离元素,以便可以使用sample 方法对它们进行采样【参考方案5】:

使用 ruby​​ 语言的 SecureRandom。

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

会生成n*2个随机字符串,包含“0-9”和“a-f”

【讨论】:

【参考方案6】:

我忘了从哪里来的,但我今天早上不知怎么读到了这篇文章

l,m = 24,36
rand(m**l).to_s(m).rjust(l,'0')

它创建从 0 到 power(36,24) 的随机数,然后将其转换为 base-36 字符串(即 0-9 和 a-z)

【讨论】:

这个比steenslag的gist.github.com/cameron-martin/a7a91f0bc952e8a5c795快 除非rand(36**len).to_s(36).length == len 并不总是正确的,所以你必须这样做rand(36**len).to_s(36).rjust(len, '0')【参考方案7】:
((('a'..'z').to_a + (0..9).to_a)*3).shuffle[0,(rand(100).to_i)].join

rand(100) 替换为rand(n),其中n 是所需字符串的最大长度。

【讨论】:

【参考方案8】:

所有字母和数字,这就是数字以 36 为底的表示方式。

api_string = Array.new(32)rand(36).to_s(36).join

【讨论】:

【参考方案9】:

如果您使用的是 ruby​​ 1.9.2,则可以使用 SecureRandom:

irb(main):001:0> require 'securerandom'
=> true
irb(main):002:0> SecureRandom.hex(13)
=> "5bbf194bcf8740ae8c9ce49e97"
irb(main):003:0> SecureRandom.hex(15)
=> "d2413503a9618bacfdb1745eafdb0f"
irb(main):004:0> SecureRandom.hex(32)
=> "432e0a359bbf3669e6da610d57ea5d0cd9e2fceb93e7f7989305d89e31073690"

【讨论】:

这对于简单的需求来说很方便,但 alpha 范围只是 a-f,因此生成的字符串的安全性/复杂性并没有达到应有的水平。 最好使用base64,同样内置:SecureRandom.base64(16).gsub(/=+$/,'') API 密钥不是问题,但也有方便的 urlsafe_base64 方法:SecureRandom.urlsafe_base64(16) => "XpMnLfc3FySd-C4V2Ipxag" 为什么使用base64更好 更好SecureRandom.urlsafe_base64(length)【参考方案10】:

这是一种方法:

POSSIBLE = (('A'..'Z').to_a + (0..9).to_a)
api_string = (0...32).map  |n| POSSIBLE.sample .join

如果您有可用的 Active Support,您也可以这样做来制作类似 API 密钥的字符串:

ActiveSupport::SecureRandom.hex(32)

【讨论】:

【参考方案11】:
CHARS = (?0..?9).to_a + (?a..?z).to_a
api_string = 32.times.inject("") |s, i| s << CHARS[rand(CHARS.size)]

【讨论】:

以上是关于生成带有小写字母和数字的唯一随机字符串的主要内容,如果未能解决你的问题,请参考以下文章

生成包含大写字母,小写字母,数字的随机字符串

Oracle生成随机大小写数字字符串

Oracle生成随机大小写数字字符串

VBA 生成随机唯一的字母数字字符串

怎么用c语言随机生成一串字符串,字符串要求8-16位并且包含大小写字母.数字.和符号

如何用java随机生成一个字母