Генерация направляющих в Ruby - PullRequest
121 голосов
/ 13 июля 2009

У меня есть проблема, которая действительно легко решается с помощью Guids.

В частности, для рабочего процесса сброса пароля я хотел бы отправить токен Guid на электронную почту пользователя и попросить его сбросить пароль с помощью токена. Поскольку руководства уникальны, это довольно безопасно и экономит мое электронное письмо с паролями, что рискованно.

Я заметил, что есть один Guid gem для Ruby; но он выглядит довольно старым и записывает данные в файловую систему.

Кто-нибудь знает о каких-либо других драгоценных камнях, которые могут создать глобально уникальный идентификатор?

Я знаю, что могу просто вернуться к:

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

Но на самом деле это не похоже на правильный GUID ...

Ответы [ 10 ]

267 голосов
/ 06 марта 2012

Начиная с Ruby 1.9, генерация uuid встроена. Используйте функцию SecureRandom.uuid.

Например:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
35 голосов
/ 06 октября 2009

Мы используем UUIDTools и не имеем проблем с ним.

34 голосов
/ 14 июля 2009

Как создавать небольшие уникальные токены в 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"
21 голосов
/ 13 июля 2009

Вы смотрели на UUIDTools ?

UUIDTools был разработан как простая библиотека для генерации любого из различных типов UUID (или GUID, если вы предпочитаете называть их так). По возможности соответствует RFC 4122.

15 голосов
/ 06 октября 2009

Google выдает следующую библиотеку Ruby:

http://raa.ruby -lang.org / проект / рубинового Guid /

Кроме того, по адресу http://www.ruby -forum.com / topic / 99262 они говорят, что вы можете установить гем (выполнить gem uuid в командной строке для его установки), а затем выполнить

gem 'uuid'
puts UUID.new

в вашем коде, чтобы увидеть новый UUID.

(Подсказка: я гуглил для ruid ruby ​​)

3 голосов
/ 26 мая 2017

Небольшое обновление к ответу Симоне Карлетти:

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

=> "AEWQyovNFo0"

можно заменить на:

SecureRandom.urlsafe_base64 (8)

1 голос
/ 04 сентября 2013

Для создания правильного, mysql, varchar 32 GUID

SecureRandom.uuid.gsub('-','').upcase
1 голос
/ 06 ноября 2012

При программировании поздно ночью я придумал следующее решение (на основе Simone) для генерации уникального GUID в Rails. Я не горжусь этим, но он работает довольно хорошо.

while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end
0 голосов
/ 11 октября 2018

Это метод neet, который я выучил из 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
0 голосов
/ 03 июня 2015

Когда я использовал гемы uuid, рекомендуемые в этом вопросе, никто не может генерировать уникальный и случайный UUID. Мой ответ - обходной путь: если у нас будет gem позже, чтобы удовлетворить запрос, вам лучше использовать gem в Ruby.

В этом вопросе я пробую большинство рекомендуемых драгоценных камней uuid, но меня никто не удовлетворяет, нам нужен уникальный и случайный uuid. Я непосредственно запускаю системную команду uuidgen в ruby, и мне нравится результат, и делюсь здесь.

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.

...