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 ...
À 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"
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"
Nous utilisons IDTools et n'avons aucun problème avec cela.
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.
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 )
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
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
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.
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