ruby-on-rails - 创建一个唯一的哈希

标签 ruby-on-rails ruby ruby-on-rails-4 hash

我需要创建一个与数据库中的 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/

相关文章:

ruby-on-rails - 预期 true 响应 true?

ruby-on-rails - 基于 has_many 范围计数的 Rails 事件记录范围

ruby-on-rails - 表中的多个数据库记录与数据库查询?什么是最好的性能?

ruby-on-rails - 在我的 Rails 应用程序上发送电子邮件时出现 Net::SMTPUnknownError (could not get 3xx (550)) 错误

mysql - Rails 生产中的 "Connecting to database specified by database.yml"

ruby-on-rails - 2个大小写不同的字符串数组的交集

mysql - Rails/Devise/ActiveRecord不接受Unicode字符

ruby-on-rails - 如何为子文件夹中的对象提供服务

javascript - Rails javascript仅在双击时有效,如何解决?

ruby-on-rails - ActiveStorage::FileNotFoundError 但文件实际存在