From: Jamie Macey Date: 2008-12-29T21:19:45+09:00 Subject: Re: Options to generate small, kind of unique, human-readable tokens (like "V0cM9tnV") ? On Dec 29, 4:44 am, Thibaut Barrère wrote: > Hi, > > I'm pretty sure there is a number of options to achieve this, so I'm > asking here. I often need to generate small unique tokens (like for > invitation codes or unimportant authentication token). > > In the past I've been using Digest::SHA1.hexdigest(some string) which > gives us something like "d2b7882fa08bb6de8dca62f16298683bfe4f0738". > It's not very user friendly though, and definitely not small. I've mostly just used a substring on SHA1 - hexdigest[8...16] is small enough to be usable, but still pseudo-random enough for temporary tokens to not be guessable. > More recently I've been using ActiveSupport::SecureRandom.base64(6) > which generates "Xst7JGF6" or "zXxWY/Y/", but sometimes it contains > non-url friendly characters like "/". Base64 is A-Za-z0-9/-. Gsub / for _ and you're pretty url friendly. > What do you use ? Is there a specific gem to achieve this in a robust > fashion (= making collisions unlikely, and specify the characters to > be used, like mixture of numbers and characters for instance ?) Lastly, not terribly robust, but functional: chars = ['A'..'Z', 'a'..'z', '0'..'9'].map{|r|r.to_a}.flatten Array.new(6).map{chars[rand(chars.size)]} -- Jamie