在 Ruby 中生成 GUID

我有一个很容易用 GUID 解决的问题。

特别是,对于密码重置工作流,我想发送一个 GUID 令牌到用户的电子邮件,并让他们使用令牌重置他们的密码。由于 GUID 是独一无二的,这是相当安全的,并节省了我发送电子邮件给人们的密码,这是危险的。

我注意到有一个 Uuid gem@rubyforge.uuid gem@rubyforge.uuid gem@rubyforge.uuid gem@rubyforge.uuid gem,但它看起来很旧,它写东西到文件系统。

还有谁知道其他能制造全局唯一标识符的宝石吗?

我知道我可以回到:

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

但它似乎并不真正像一个适当的 GUID..。

103291 次浏览

你看过 UUIDTools了吗?

UUIDTools 被设计成一个简单的库,用于生成各种类型的 UUID (或 GUID,如果您喜欢这样称呼它们的话)。它尽可能符合 RFC4122。

如何在 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"

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。

(提示: 我谷歌了 Guid Ruby)

从 Ruby 1.9开始,uuid 生成是内置的。

例如:

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

在深夜编程时,我想出了下面这个解决方案(基于 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。

我在这个问题中尝试了大多数推荐的 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宝石相比,你会知道差别。

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 环境。

西蒙妮 · 卡莱蒂的小小更新回答:

Base64(8) . gsub (“/”,“ _”) . gsub (/= + $/,“”)

= > 「 AEWQyovNFo0」

可由以下项目取代:

Urlsafe _ base64(8)

这是我从 JavaScript 中学到的一项净技术:

def uuid
"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
"0123456789ABCDEF"[rand(16)]
end
end

尽管用一种更“红宝石”的方式,人们也可以这样做:

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

对于运行 postgreSQL 数据库的 Rails,需要做两件事。

步骤1: 生成一个脚手架/模型

rails g scaffold manager name:string --primary-key-type=uuid

步骤2: 向迁移文件添加一行

如果你现在 rails db:migrate,你会得到一个 PG::UndefinedFunction: ERROR: function gen_random_uuid() does not exist错误。

因此,将 这个添加到迁移文件中

enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')

例如:

class CreateManagers < ActiveRecord::Migration[7.0]


enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')


def change
create_table :managers, id: :uuid do |t|
t.string :name
t.timestamps
end
end
end

你完蛋了!

哦,最后一件事,您只需要将 enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')添加到一个迁移文件(例如,您第一次使用 uuid 类型时)。

新铁路版本 > = 5.1

对于新的 Rails 版本,您现在可以使用 在 Digest::UUID下的方法,例如: < a href = “ https://docs2.w3cu.com/ails% 7E5.1/pedia/uuid/uuid _ v4”rel = “ nofollow noReferrer”> Digest::UUID.uuid_v4

请参阅 API 文档: