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 - Rails 应用程序与运行 Ubuntu 的本地机器交互

ruby-on-rails - Chef solo如何安装postgresql 9.3和minitest

ruby - 使用 mechanize 获取特定的所有标签? ( ruby )

Ruby Twitter 如何授权用户?

ruby-on-rails - PG::InsufficientPrivilege at/ERROR:关系 schema_migrations 的权限被拒绝

css - 如何让 HTTPS 域拉入 CSS 数据?

ruby-on-rails - Heroku 上的 Rails Friendly_Id,Heroku 不更新 slug

ruby - 用于 nginx 的 ruby​​ 中的自定义目录列表处理程序

Ruby 'gets' 表现怪异?

ruby-on-rails - 为 nil :NilClass 获取未定义的方法 `errors'