【问题标题】:Secondary pseudo-random unique key for records using Ruby on Rails and PostgreSQL使用 Ruby on Rails 和 PostgreSQL 的记录的辅助伪随机唯一键
【发布时间】:2011-11-21 02:24:23
【问题描述】:

我想在当前使用 PostgreSQL 数据库的 Ruby on Rails 应用程序中为我的表添加辅助生成键。如果可能的话,我想成为数据库不可知论者。目标是在 URL 上使用这个键,这样外部用户就无法猜测数据库的大小或我拥有的每种类型的记录数量。

我知道 UUID,但它们很长而且有点矫枉过正。另外,这个字段应该被索引,我知道索引中的随机数据是有问题的。

如果没有干净的解决方案,我会制定一个小公式来应用到 id 并确保我检查冲突并避免它们;但我确定我不是第一个遇到这个问题的人。

【问题讨论】:

  • 索引中的随机数据不是问题。不过,聚集索引中的随机数据可能是个问题。
  • 关于 UUID,您是否因为 16 字节太长而拒绝它们?如果是这样,多少字节才足够长?
  • Catcall:大概 6 个字节就够了,不过我不确定。

标签: ruby-on-rails postgresql uniqueidentifier


【解决方案1】:

我正在考虑这样做:

SecureRandom.urlsafe_base64(n * 3).gsub(/[A-Z\-_]/, "")[0..n]

其中 n 是一个安全的基本起始数字...我会说,5 或 6。我过滤掉了一些我不希望在 id 中出现的字符。当发生数据库冲突时,我再次运行它,但我增加了 n,所以如果一个表突然获得大量记录,它不应该尝试那么多次来找到可用的记录。

【讨论】:

    【解决方案2】:

    我过去有过类似的情况,我使用了 SHA 哈希,它由 id 和 created_at 中的字符串组成,或者你喜欢的任何东西,可以使它成为一个唯一的字符串,然后做一个 hexdigest。

    类似,代码未测试

    Digest::SHA1.hexdigest( self.id.to_s + self.created_at.to_s )
    

    即使您设法同时创建记录,id 也应该给您一个唯一的字符串。 它不能保证完全的唯一性,因为它是一个散列,但机会很小,您可以运行检查以确保是否有任何重复,或者尽可能设置数据库。

    希望这会有所帮助。

    【讨论】:

    • 我唯一的问题是它对我的口味来说太长了。
    猜你喜欢
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多