web-dev-qa-db-fra.com

Génération de guides dans Ruby

J'ai un problème qui est vraiment facilement résolu avec Guids.

En particulier, pour un flux de travail de réinitialisation de mot de passe, j'aimerais envoyer un jeton Guid à la messagerie d'un utilisateur et lui demander de réinitialiser son mot de passe à l'aide du jeton. Étant donné que les guids sont uniques, cela est assez sécurisé et me sauve en envoyant des mots de passe aux gens, ce qui est risqué.

J'ai remarqué qu'il y en a un Guid gem pour Ruby; mais il a l'air assez vieux et écrit des choses dans le système de fichiers.

Est-ce que quelqu'un connaît d'autres joyaux qui peuvent créer un identifiant global unique?

Je sais que je peux juste revenir à:

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

Mais cela ne semble pas vraiment être un bon GUID ...

124
Sam Saffron

À partir de Ruby 1.9, la génération d’aides est intégrée. Utilisez le SecureRandom.uuid fonction.

Par exemple:

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

Comment créer de petits jetons uniques en 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"
36
Simone Carletti

Nous utilisons IDTools et n'avons aucun problème avec cela.

35
Avdi

Avez-vous regardé IDTools ?

UUIDTools a été conçu pour être une simple bibliothèque permettant de générer l’un des différents types d’UUID (ou un GUID si vous préférez les appeler ainsi). Il est conforme à la RFC 4122 chaque fois que possible.

21
Andrew Hare

Google donne la bibliothèque suivante Ruby:

http://raa.Ruby-lang.org/project/Ruby-guid/

En outre, sur http://www.Ruby-forum.com/topic/99262 ils disent que vous pouvez installer une gemme (execute gem uuid sur la ligne de commande pour l’installer) puis faites

gem 'uuid'
puts UUID.new

dans votre code pour voir un nouvel UUID.

(Astuce: J'ai cherché sur Google pour guid Ruby )

16
Marc W

Petite mise à jour de Simone Carletti:

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

=> "AEWQyovNFo0"

peut être remplacé par:

SecureRandom.urlsafe_base64 (8)

Pour créer un GUID correct, mysql, varchar 32

SecureRandom.uuid.gsub('-','').upcase
2
Aaron Henderson

Lors de la programmation tard dans la nuit, j'ai proposé la solution suivante (basée sur celle de Simone) pour générer un GUID unique dans Rails. Je n'en suis pas fier mais ça marche plutôt bien.

while Order.find_by_guid(guid = Rand(36**8).to_s(36).upcase).present?; end
1
robotmay

Lorsque j'ai utilisé les gemmes uuid recommandées dans cette question, personne ne peut générer d'UUID unique et aléatoire. Ma réponse est un moyen de contourner le problème. Si nous avons plus tard une gemme pour satisfaire la demande, vous feriez mieux de l'utiliser en Ruby.

J'essaie les gemmes uuid les plus recommandées dans cette question, mais personne ne me satisfait, nous avons besoin d'uuid unique et aléatoire. J'exécute directement la commande système uuidgen en Ruby, et j'aime le résultat et le partage ici.

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

si vous comparez avec uuid gem, vous saurez faire la différence.

irb(main):003:0> uuid.generate
=> "40cdf890-ebf5-0132-2250-20c9d088be77"
irb(main):004:0> uuid.generate
=> "4161ac40-ebf5-0132-2250-20c9d088be77"

L'environnement de test est l'environnement Linux et Mac OS.

0
BMW

C'est une technique de néet que j'ai apprise avec JavaScript:

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

Bien que d'une manière plus 'Ruby' on pourrait aussi faire:

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