在Ruby on Rails中为每个用户分配一个唯一的100个字符哈希

我在网站上有一个表格,可以从访客那里获取一些个人信息。 我将此信息传递给另一个服务,我需要为这些表单中的每一个分配一个100字符的唯一哈希值,以便与记录一起存储在DB中。 生成此密钥并确保其唯一的最佳方法是什么? 如果键自动递增也没关系。

ActiveSupport::SecureRandom.hex(50) 

这不是唯一的机会是天文数字。

替代简单的“不缩放”竞争条件失败解决方案。

 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 

如果你真的想确定,在列上创建一个唯一索引,并通过重试处理数据库唯一性错误,类似于我上面的实现。

Ruby标准库有一个用于生成GUID的模块:

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

例:

 Digest::SHA1.hexdigest(Time.now.to_s) 

如果您使用密码,您可以加密始终不同的消息以获得始终不同的密钥:

  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"