如何在rails中生成固定长度(最多10个字符)的唯一id唯一数字

时间:2020-01-08 03:17:38

标签: ruby-on-rails-5

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

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

现在,我只是发布问题。如果您碰巧知道该怎么做,我将不胜感激

1 个答案:

答案 0 :(得分:1)

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

但是请注意,要生成10- 位数 ID,以下方法会更好:SecureRandom.random_number(10 ** 10)。请注意,这样一来,在生成大约100,000个数字之后就有可能产生重复的数字(有关更精确的陈述和公式,请参见“ Birthday problem”)。

如果除了数字之外,您还可以接受一小部分字母(a至f),那么以下内容可能对您更好:SecureRandom.hex(5)。在这里,重复的机会更小,并且产生大约一百万次之后的可能性就很大。

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

另一种方法是使用秘密密钥对顺序计数器进行加密(例如,通过保留格式的加密)。尽管这种方法保留了唯一性,但复杂的是必须保护密钥不受攻击。