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