生成带有小写字母和数字的唯一随机字符串
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)]
【讨论】:
以上是关于生成带有小写字母和数字的唯一随机字符串的主要内容,如果未能解决你的问题,请参考以下文章