Generowanie GUID w Ruby

Mam problem, który łatwo rozwiązać z Guidami.

W szczególności, dla przepływu pracy resetowania hasła, chciałbym wysłać token Guid na adres e-mail użytkownika i poprosić go o zresetowanie hasła za pomocą tokenu. Ponieważ GUID są unikalne, jest to dość bezpieczne i oszczędza mi wysyłanie haseł do ludzi, co jest ryzykowne.

Zauważyłem, że istnieje jedengem Guid dla Rubiego; ale wygląda dość stary i pisze rzeczy do systemu plików.

Czy ktoś znasz jakieś inne klejnoty, które mogą stworzyć globalnie unikalny identyfikator?

I know I can just fall back to:

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

Ale to nie wygląda na właściwy GUID ...

 148
Author: Sildoreth, 2009-07-13

10 answers

Od wersji Ruby 1.9, generowanie uuid jest wbudowane. Użyj SecureRandom.uuid funkcja.

Na przykład:

require 'securerandom'
SecureRandom.uuid # => "96b0a57c-d9ae-453f-b56f-3b154eb10cda"
 327
Author: J _,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-13 16:48:47

Jak tworzyć małe, unikalne tokeny w 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"
 38
Author: Simone Carletti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-16 04:11:15

Używamy UUIDTools i nie mamy z tym żadnych problemów.

 35
Author: Avdi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-02 15:58:46

Spojrzałeś na UUIDTools ?

UUIDTools został zaprojektowany jako prosta biblioteka do generowania dowolnych typów uuid (lub GUID, jeśli wolisz je tak nazywać). W miarę możliwości jest zgodny z RFC 4122.

 22
Author: Andrew Hare,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-13 03:30:26

Google daje następującą bibliotekę Ruby:

Http://raa.ruby-lang.org/project/ruby-guid/

Również, nad http://www.ruby-forum.com/topic/99262 mówią, że możesz zainstalować gem (wykonaj gem uuid w wierszu poleceń, aby go zainstalować), a następnie wykonaj

gem 'uuid'
puts UUID.new

W Twoim kodzie, aby zobaczyć nowy UUID.

(podpowiedź: Wygooglowałem dla guid ruby )

 16
Author: Marc W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-05 23:32:22

Aby utworzyć właściwy, mysql, varchar 32 GUID

SecureRandom.uuid.gsub('-','').upcase
 4
Author: Aaron Henderson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 08:55:42

Mała aktualizacja do Simone Carletti odpowiedź:

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

= > "AEWQyovNFo0"

Można zastąpić przez:

SecureRandom.urlsafe_base64 (8)

 3
Author: Алексей Лещук,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 11:11:29

Podczas programowania późno w nocy wymyśliłem następujące rozwiązanie (oparte na Simone ' s) do generowania unikalnego GUID w Rails. Nie jestem z tego dumny, ale działa całkiem dobrze.

while Order.find_by_guid(guid = rand(36**8).to_s(36).upcase).present?; end
 1
Author: robotmay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-06 09:04:25

Kiedy użyłem klejnotów uuid zalecanych w tym pytaniu, nikt nie może wygenerować unikalnego i losowego UUID. Moja odpowiedź to obejście, jeśli mamy gem później, aby spełnić prośbę, lepiej Użyj gem w Ruby.

W tym pytaniu próbuję większości polecanych klejnotów uuid, ale nikt mnie nie zadowala, potrzebujemy unikalnego i losowego uuid. Uruchamiam bezpośrednio polecenie systemowe uuidgen w Rubim, i podoba mi się wynik, i udostępnij tutaj.

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

Jeśli porównać z uuid gem, będziesz wiedział, że różnica.

irb(main):003:0> uuid.generate
=> "40cdf890-ebf5-0132-2250-20c9d088be77"
irb(main):004:0> uuid.generate
=> "4161ac40-ebf5-0132-2250-20c9d088be77"
Środowisko testowe to środowisko linux i Mac OS.
 0
Author: BMW,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-16 23:27:33

Jest to technika neet, której nauczyłem się z JavaScript:

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

Chociaż w bardziej "rubinowy sposób" można też zrobić:

def uuid
    "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx".gsub("x") do
        rand(16).to_s(16)
    end
end
 0
Author: Sancarn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-11 09:26:26