给定长度的完全随机标识符

gla*_*kou 5 ruby ruby-on-rails ruby-on-rails-3

我想生成一个完全随机的"唯一"(我将确保使用我的模型)给定的标识符(长度可能不同)长度包含数字,字母和特殊字符

例如:

161551960578281|2.AQAIPhEcKsDLOVJZ.3600.1310065200.0-514191032|
Run Code Online (Sandbox Code Playgroud)

有人可以建议在Ruby on Rails中最有效的方法吗?

编辑:重要提示: 如果可能,请评论您提出的解决方案的效率,因为每次用户进入网站时都会使用此解决方案!

谢谢

emb*_*oss 12

将此用作访问令牌与UUID不同.您不仅需要伪随机性,还需要一个加密安全的PRNG.如果你真的不关心你使用的是什么字符(它们没有向安全性添加任何内容),你可以使用以下内容,生成一个URL安全的Base64编码的访问令牌.如果您将令牌附加到URL,URL安全性就变得很重要,类似于某些Java Web应用程序所做的那样:"http://www.bla.com/jsessionid=".如果您为此目的使用原始Base64字符串,则会产生可能无效的URL.

require 'securerandom'

def produce_token(length=32)
  token = SecureRandom.urlsafe_base64(length)
end
Run Code Online (Sandbox Code Playgroud)

获得重复的概率等于2 ^( - 长度).由于输出将采用Base64编码,因此实际输出长度为4/3*.如果已安装,则基于本机OpenSSL PRNG实现,因此在性能方面应该非常高效.如果没有安装OpenSSL扩展,/dev/urandom将在可用时使用,最后,如果您在Windows机器上,CryptGenRandom将用作后备.这些选项中的每一个都应该具有足够的性能.例如,在我的笔记本电脑上运行produce_token一百万次完成~6s.