У меня проблема, которую действительно легко решить с помощью Guids.
В частности, для рабочего процесса сброса пароля я хотел бы отправить токен Guid на электронную почту пользователя и попросить их сбросить свой пароль с помощью токена. Поскольку руководства уникальны, это довольно безопасно и избавляет меня от отправки паролей по электронной почте, что является рискованным.
Я заметил, что для Ruby есть один гем Guid ; но он выглядит довольно старым и записывает данные в файловую систему.
Кто-нибудь знает какие-нибудь другие драгоценные камни, которые могут создать глобальный уникальный идентификатор?
Я знаю, что могу просто вернуться к:
(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"
источник
Как создать маленькие уникальные токены в 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 ?
источник
Google предоставляет следующую библиотеку Ruby:
http://raa.ruby-lang.org/project/ruby-guid/
Кроме того, на http://www.ruby-forum.com/topic/99262 говорится, что вы можете установить гем (выполнить
gem uuid
в командной строке, чтобы установить его), а затем выполнитеgem 'uuid' puts UUID.new
в вашем коде, чтобы увидеть новый UUID.
(Подсказка: я искал guid ruby в Google )
источник
Чтобы создать правильный GUID mysql, varchar 32
SecureRandom.uuid.gsub('-','').upcase
источник
SecureRandom.hex.upcase
Небольшое обновление для ответа Симоне Карлетти:
можно заменить на:
источник
При программировании поздно ночью я придумал следующее решение (основанное на Simone's) для генерации уникального GUID в Rails. Я не горжусь этим, но работает неплохо.
while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end
источник
В этом вопросе я пробую большинство рекомендуемых драгоценных камней 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.
источник
puts `...`
в основном выполняет системный вызов,uuidgen(3)
который дает сбой на любой другой платформе, кроме Linux, увеличивает время выполнения и в целом действительно противоречит интуитивной практике кодирования. Почему вы выбрали такой метод?SecureRandom
поскольку это выполняет ту же функцию в том же методе, что и,uuidgen
но в отличие отuuidgen
использования блокировки / dev / randomSecureRandom
сначала использует только библиотеку openssl, затем переходит на dev / urandom, а затем, наконец, / dev / random в попытках сделать неблокирующая генерация рандомизации.Это новый метод, который я узнал из 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
источник