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

时间:2010-01-24 00:41:14

标签: ruby-on-rails hash

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

3 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:2)

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

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

示例:

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

答案 2 :(得分:0)

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

  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"