Assigning Each User a Unique 100 character Hash in

2019-03-11 08:28发布

I have a form on a website that takes in some personal information from the visitor. I'm passing this information to another service and I need to assign each one of these form submits a 100 character unique hash to be stored in the DB with the record. What's the optimal way to generate this key and make sure it's unique? It's okay if the key auto-increments.

3条回答
不美不萌又怎样
2楼-- · 2019-03-11 08:42

If you use a Cipher you can encrypt an always different message to get an always different key:

  def encrypt(data, key, cipher_type)
    aes = OpenSSL::Cipher::Cipher.new(cipher_type)
    aes.encrypt
    aes.key = key
    aes.update(data) + aes.final      
  end

>> Base64.encode64(encrypt(Time.now.to_s, "some_key_long_enough_for_the_job", "AES-256-ECB"))
=> "sKJU3qhszV30Ya9vMFvbqIXus+QygICdDyr7UQFWLeM=\n"
查看更多
倾城 Initia
3楼-- · 2019-03-11 08:50

The Ruby standard lib has a module for generating GUIDs:

http://ruby-doc.org/stdlib/libdoc/digest/rdoc/classes/Digest/SHA2.html

Example:

Digest::SHA1.hexdigest(Time.now.to_s)
查看更多
Anthone
4楼-- · 2019-03-11 08:59
ActiveSupport::SecureRandom.hex(50)

The chance of this not being unique is astronomical.

Alternate simple "does not scale" race condition fail solution.

class MyModel < ActiveRecord::Base
  before_create :assign_unique_token

  private

  def assign_unique_token
    self.unique_token = ActiveSupport::SecureRandom.hex(50) until unique_token?
  end

  def unique_token?
    self.class.count(:conditions => {:unique_token => unique_token}) == 0
  end
end

If you really want to make sure, make an unique index on the column, and handle a DB uniqueness error by retrying, similar to my implementation above.

查看更多
登录 后发表回答