我想应用唯一的id,但不明显,但希望不超过10个字符(固定长度),并且只能是数字。
现在使用SecureRandom.random_number (10 ** 9)
,但是我怀疑将来是否会出现重复问题,也曾经实施过DateTime.now.strftime('% Q')
,希望每毫秒找到一个唯一的id,但是它产生了13个字符。
现在,我只是发布问题。如果您碰巧知道该怎么做,我将不胜感激
答案 0 :(得分:1)
如果您想要难以猜测的10位ID,那么SecureRandom
就很难被击败。
但是请注意,要生成10- 位数 ID,以下方法会更好:SecureRandom.random_number(10 ** 10)
。请注意,这样一来,在生成大约100,000个数字之后就有可能产生重复的数字(有关更精确的陈述和公式,请参见“ Birthday problem”)。
如果除了数字之外,您还可以接受一小部分字母(a至f),那么以下内容可能对您更好:SecureRandom.hex(5)
。在这里,重复的机会更小,并且产生大约一百万次之后的可能性就很大。
但是请记住,通常来说,随机数会产生重复的风险,因此您需要一种检查随机ID唯一性的方法。
另一种方法是使用秘密密钥对顺序计数器进行加密(例如,通过保留格式的加密)。尽管这种方法保留了唯一性,但复杂的是必须保护密钥不受攻击。