在Ruby中生成Guids

Sam*_*ron 130 ruby guid

我有Guids很容易解决的问题.

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

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

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

我知道我可以回到:

(0..16).to_a.map{|a| rand(16).to_s(16)}.join 
Run Code Online (Sandbox Code Playgroud)

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

小智 290

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

例如:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
Run Code Online (Sandbox Code Playgroud)

  • 为了节省一些查询,你需要'securerandom' (22认同)
  • 它不能保证是独一无二的,但对于大多数实际用途,可以安全地假设它是独一无二的.请参阅:http://stackoverflow.com/questions/2977593/is-it-safe-to-assume-a-guid-will-always-be-unique (8认同)
  • SecureRandom.uuid生成一个随机UUID,因此不能保证它是唯一的.如果你只想要一个可能是唯一的随机字符串,那么可以使用它.但是,如果您想要保证唯一的东西,则需要使用包含MAC地址,时间戳等的内容. (5认同)

Sim*_*tti 37

如何在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"
Run Code Online (Sandbox Code Playgroud)

  • 这个页面上有很多很酷的解决方案. (2认同)

Avd*_*vdi 35

我们使用UUIDTools并没有问题.

  • 与uuid gem不同,uuidtools不保留任何状态文件.状态文件的权限问题使得uuid gem与多个用户一起使用有点尴尬. (3认同)
  • 即使系统没有MAC地址,'uuidtools'仍可正常工作.在这种情况下,'uuid'失败了. (2认同)

And*_*are 21

你看过UUIDTools了吗?

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


Mar*_*c W 16

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
Run Code Online (Sandbox Code Playgroud)

在您的代码中查看新的UUID.

(提示:我用Google搜索guid红宝石)

  • 多数民众赞成......我用谷歌搜索了"guid ruby​​",我得到的就是这个帖子:-P (5认同)

Але*_*щук 6

对Simone Carletti 答案的小更新:

SecureRandom.base64(8).gsub("/","_").gsub(/=+$/,"")

=> "AEWQyovNFo0" 
Run Code Online (Sandbox Code Playgroud)

可以替换为:

SecureRandom.urlsafe_base64(8)
Run Code Online (Sandbox Code Playgroud)


Aar*_*son 5

创建正确的 mysql、varchar 32 GUID

SecureRandom.uuid.gsub('-','').upcase
Run Code Online (Sandbox Code Playgroud)