在Ruby中生成Guids

时间:2009-07-13 03:20:56

标签: ruby guid

我的问题很容易通过Guids解决。

特别是,对于密码重置工作流程,我想将Guid令牌发送到用户的电子邮件,并让他们使用令牌重置密码。由于guids是唯一的,这是非常安全的,并且节省了我通过电子邮件发送人员密码,这是有风险的。

我注意到Ruby有一个Guid gem;但它看起来很旧,它把东西写入文件系统。

有谁知道可以创建全球唯一标识符的任何其他宝石?

我知道我可以回到:

(0..16).to_a.map{|a| rand(16).to_s(16)}.join 

但它看起来并不像是一个合适的GUID ......

10 个答案:

答案 0 :(得分:264)

从Ruby 1.9开始,uuid生成就是内置的。使用SecureRandom.uuid功能。

例如:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"

答案 1 :(得分:35)

我们使用UUIDTools并且没有任何问题。

答案 2 :(得分:34)

How to create small, unique tokens in 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"

答案 3 :(得分:21)

你看过UUIDTools吗?

  

UUIDTools被设计为一个简单的库,用于生成任何各种类型的UUID(如果您愿意将其称为GUID,则为GUID)。只要有可能,它就符合RFC 4122。

答案 4 :(得分:15)

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搜索 guid ruby​​

答案 5 :(得分:3)

对Simone Carletti的小更新回答:

  

SecureRandom.base64(8).gsub(&#34; /&#34;&#34; _&#34)。GSUB(/ = + $ /&#34;&#34)< / p>      

=&GT; &#34; AEWQyovNFo0&#34;

可以替换为:

  

SecureRandom.urlsafe_base64(8)

答案 6 :(得分:1)

在深夜编程时,我提出了以下解决方案(基于Simone的),用于在Rails中生成唯一的GUID。我并不为此感到自豪,但它确实很有效。

while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end

答案 7 :(得分:1)

创建一个合适的mysql,varchar 32 GUID

SecureRandom.uuid.gsub('-','').upcase

答案 8 :(得分:0)

  

当我使用此问题中推荐的uuid gem时,没有人可以生成唯一且随机的UUID。我的答案是一个解决方案,如果我们以后有宝石满足请求,你最好在Ruby中使用gem。

我在这个问题上尝试了大多数推荐的uuid宝石,但没有人让我满意,我们需要独特和随机的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环境。

答案 9 :(得分:0)

这是我从JavaScript中学到的一种新技术:

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"[rand(36)]
    end
end

虽然也可以通过“红宝石”方式做到:

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        rand(16).to_s(16)
    end
end