创建一个唯一的哈希

Tyl*_*ler 2 ruby hash ruby-on-rails ruby-on-rails-4

我需要创建一个与数据库中的ID对应的唯一哈希.我是否应该生成一个随机的字母数字哈希,然后将其存储在数据库中的特定行中?

现在这就是我正在做的事情,但我需要确保人们无法弄清楚创建这些哈希值的算法.

params[:slug].to_i(36)

id.to_s(36)
Run Code Online (Sandbox Code Playgroud)

yey*_*eyo 5

实际上很简单:

enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation
enum.next.join
 => "qmrbSTBu6gGpMs4Jh0VZAiI9cW58jxoDz2NwL1eUClaFtdRXfPEOYQnvkKy7H3"
Run Code Online (Sandbox Code Playgroud)

这提供了 factorial(62)uniq字符串/ uids.(非常多!)

permutation如果你想要更短的字符串/ uid,你也可以提供一个限制,但这会减少你可以生成的uniq字符串/ uids的数量.

enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation(13)
enum.next.join
 => "A1BD3qljTKpOm"
Run Code Online (Sandbox Code Playgroud)

如果您担心安全性,那么使用安全的随机种子对阵列进行洗牌:

ary = [*'a'..'z', *'A'..'Z', *0..9].shuffle(random: SecureRandom.hex(23).to_i(16))
enum = ary.permutation(13)
enum.next.join
 => "9bNmv82ruBKjq"
Run Code Online (Sandbox Code Playgroud)

唯一性是保证(因此有限),没有调用数据库或测试唯一性的开销.