在Ruby中生成Guids
我有Guids很容易解决的问题。
特别是,对于密码重置工作流程,我想将Guid令牌发送到用户的电子邮件,并让他们使用令牌重置密码。 由于guids是唯一的,这是非常安全的,并且节省了我通过电子邮件发送人员密码,这是有风险的。
我注意到Ruby有一个Guidgem ; 但它看起来很旧,它把东西写入文件系统。
有谁知道可以创建全球唯一标识符的任何其他gem?
我知道我可以回到:
(0..16).to_a.map{|a| rand(16).to_s(16)}.join
但它看起来并不像是一个合适的GUID ……
从Ruby 1.9开始,uuid生成就是内置的。 使用SecureRandom.uuid
函数。
例如:
require 'securerandom' SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
我们使用UUIDTools并没有任何问题。
如何在Ruby中创建小的,独特的令牌
>> require 'digest' => [] >> Digest::SHA1.hexdigest("some-random-string")[8..16] => "2ebe5597f" >> SecureRandom.base64(8).gsub("/","_").gsub(/=+$/,"") => "AEWQyovNFo0" >> rand(36**8).to_s(36) => "uur0cj2h"
你看过UUIDTools了吗?
UUIDTools被设计成一个简单的库,用于生成任何各种类型的UUID(如果您愿意将其称为GUID,则为GUID)。 只要有可能,它就符合RFC 4122。
Google产生以下Ruby库:
http://raa.ruby-lang.org/project/ruby-guid/
另外,在http://www.ruby-forum.com/topic/99262,他们说你可以安装一个gem(在命令行上执行gem uuid
来安装它)然后再做
gem 'uuid' puts UUID.new
在您的代码中查看新的UUID。
(提示:我用Google搜索guidruby )
Simone Carletti的小更新答案:
SecureRandom.base64(8).gsub( “/”, “_”)。GSUB(/ = + $ /, “”)
>“AEWQyovNFo0”
可以替换为:
SecureRandom.urlsafe_base64(8)
在深夜编程时,我提出了以下解决方案(基于Simone的),用于在Rails中生成唯一的GUID。 我并不为此感到自豪,但它确实很有效。
while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end
要创建一个正确的,mysql,varchar 32 GUID
SecureRandom.uuid.gsub('-','').upcase
当我在这个问题中推荐使用uuid gem时,没有人可以生成唯一且随机的UUID。 我的答案是一个解决方法,如果我们以后有gem满足请求,你最好在Ruby中使用gem。
我在这个问题上尝试了大多数推荐的uuidgem,但没有人让我满意,我们需要独特和随机的uuid。 我直接在ruby中运行系统命令uuidgen
,我喜欢结果,并在这里分享。
puts `uuidgen` 8adea17d-b918-43e0-b82f-f81b3029f688 puts `uuidgen` 6a4adcce-8f64-41eb-bd7e-e65ee6d11231 puts `uuidgen` 51d5348b-8fc3-4c44-a6f7-9a8588d7f08a puts `uuidgen` 332a0fa3-7b07-41e1-9fc8-ef804a377e4e
如果与uuid
gem比较,你会知道其中的差异。
irb(main):003:0> uuid.generate => "40cdf890-ebf5-0132-2250-20c9d088be77" irb(main):004:0> uuid.generate => "4161ac40-ebf5-0132-2250-20c9d088be77"
测试环境是linux和Mac OS环境。
这是我从JavaScript学到的一种技巧:
def uuid "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[rand(36)] end end
虽然以更“ruby的方式”也可以做到:
def uuid "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do rand(16).to_s(16) end end