【问题标题】:How to generate unique id only numbers with fixed length (max 10 characters) in rails如何在rails中生成具有固定长度(最多10个字符)的唯一ID号
【发布时间】:2020-01-08 03:17:38
【问题描述】:

我想应用一个不明显的唯一 ID,但希望不超过 10 个字符(固定长度)并且只有数字。

现在使用SecureRandom.random_number (10 ** 9),但我怀疑将来是否会出现重复问题,也曾经实现过DateTime.now.strftime('% Q'),希望每毫秒找到一个唯一的id,但它产生了13个字符。

现在,我只是发布问题。如果您碰巧知道如何执行此操作,我将不胜感激

【问题讨论】:

  • 这个其实是用来做订单id的,这样下单的人在提id的时候就没有问题了。如果它是一个字母表,那么它就足够复杂,以至于有人提到它,特别是如果它的长度超过 10 个字符。
  • 好的。您可以选择使用连续数字(1、2、3 等)而不是随机数字吗?每个订单 ID 都必须难以猜测吗?订单 ID 是访问订单信息唯一需要的吗?
  • 我觉得序列号太容易猜了。是的,订单 ID 是唯一需要有人知道订单详细信息的东西,这就像发票号码

标签: ruby-on-rails-5


【解决方案1】:

如果您想要难以猜到的 10 位数 ID,那么 SecureRandom 很难被击败。

但请注意,要生成 10 位 ID,最好将 10 ** 10 传递给 10 ** 9,而不是 10 ** 9。请注意,这样一来,在生成大约 100,000 个重复数字后,就有可能产生重复数字(请参阅“Birthday problem”以获取更精确的语句和公式)。

如果您可以接受除数字之外的一小部分字母(a 到 f),则以下可能更适合您:SecureRandom.hex(5)。在这里,重复的机会较小,并且在生成大约一百万个之后机会变得可能。

但请记住,随机标识符通常会产生重复的风险,因此您需要一种方法来检查随机 ID 的唯一性。

另一种方法是使用密钥加密顺序计数器(例如,通过保留格式的加密)。虽然这种方法保留了唯一性,但也存在必须保护密钥免受攻击的复杂性。

【讨论】:

    猜你喜欢
    • 2014-02-18
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多