jonnii
jonnii

Reputation: 28312

Generating unique random string for identifying a record

I have a requirement to be able to identify a record in a table, in this case a user table, by a unique key which does not give away the ordering of the records in the table.

Currently I have primary key field and the routes that are generated look like:

/users/1

However, I'd like to be able to generate a route like:

/users/kfjslncdk

I can wire everything up on the route side, database side etc.. but I'm not sure what the best way to generate a unique string identifier would be in rails. I'd like do something like:

before_save :create_unique_identifier

def create_unique_identifier
    self.unique_identifier = ... magic goes here ...
end

I was thinking I could use the first part of a guid created using UUIDTools, but I'd need to check to make sure it was unique before saving the user.

Any advice would be greatly appreciated!

Upvotes: 18

Views: 21740

Answers (5)

Fellow Stranger
Fellow Stranger

Reputation: 34013

Another possiblity is to use SecureRandom.base64 which in comparison to hex additionally use capitalized letters and “+”, “/”, “=”. Documentation.

Example:

def generate_identifier
  begin
    uid = SecureRandom.base64(8)
  end while self.class.exists?(uid: uid)
  self.uid = uid
end

Upvotes: 5

Aditya Sanghi
Aditya Sanghi

Reputation: 13433

before_create :create_unique_identifier

def create_unique_identifier
  loop do
    self. unique_identifier = SecureRandom.hex(5) # or whatever you chose like UUID tools
    break unless self.class.exists?(:unique_identifier => unique_identifier)
  end
end

Upvotes: 59

fphilipe
fphilipe

Reputation: 10056

Save yourself the trouble from storing the obfuscated id and simply encode the id with base 62 (a-z, A-Z, 0-9) but custom define the order of the "digits". This will make it very complicated to figure out the order.

I once wrote something a class that does that (might need some refactoring): https://gist.github.com/4058176

Upvotes: 3

NARKOZ
NARKOZ

Reputation: 27901

Ruby 1.9 includes a built-in UUID generator: SecureRandom.uuid

Upvotes: 10

Related Questions