我需要创建一个与数据库中的 ID 相对应的唯一哈希。我是否应该只生成一个随机的字母数字散列,然后将其存储在数据库的特定行中?
现在这就是我正在做的事情,但我需要确保人们无法弄清楚创建这些哈希值的算法。
params[:slug].to_i(36)
id.to_s(36)
最佳答案
2020 年 10 月更新:
不要自作聪明。 UUID 绰绰有余,它们便宜且生成速度快,忘记碰撞,其他故障更有可能发生(方式 WAY!!)。 UUID 背后的想法,有趣的东西。
require 'securerandom'
SecureRandom.uuid
#=> "a62f45ba-292d-425b-fb49-3733b00defe1"
旧答案:
其实很简单:
enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation
enum.next.join
=> "qmrbSTBu6gGpMs4Jh0VZAiI9cW58jxoDz2NwL1eUClaFtdRXfPEOYQnvkKy7H3"
这提供了
factorial(62)
uniq 字符串/uid。 (数量非常多!)
如果您想要更短的字符串/uid,您还可以限制排列
,但这会减少您可以生成的 uniq 字符串/uid 的数量。
enum = [*'a'..'z', *'A'..'Z', *0..9].shuffle.permutation(13)
enum.next.join
=> "A1BD3qljTKpOm"
如果您担心安全性,则使用安全的随机种子对数组进行洗牌:
ary = [*'a'..'z', *'A'..'Z', *0..9].shuffle(random: SecureRandom.hex(23).to_i(16))
enum = ary.permutation(13)
enum.next.join
=> "9bNmv82ruBKjq"
唯一性是保证(因此是有限的),没有调用数据库或测试唯一性的开销。
关于ruby-on-rails - 创建一个唯一的哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27584351/