我正在尝试生成唯一的令牌 ID,我可以使用mt_rand()
吗?
会mt_rand()
产生两次相同的数字吗?
mt_rand
会生成两次相同的数字,是的。每个随机数生成器最终可能都会这样做。(理论上)每次运行生成器时,每个数字都有相同的机会生成。它可以连续多次随机生成相同的数字。这是随机的。
要为唯一 ID 使用随机数生成器,两次生成相同数字的概率必须低到在实践中无关紧要。在这方面,mt_rand
恐怕还不够。随机生成的唯一 id 的概念已被形式化为UUID,您应该将其完全用于通用唯一 id的目的。
拿这个报价:
...仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。
由于mt_rand
在 32 位系统上返回一个 32 位整数,它只能返回 2^32 个唯一值,也就是只有 4,294,967,296 个唯一值。mt_rand
如果您每秒生成十亿个值,则基本上可以保证4 秒后出现重复。希望这能说明 UUID 之间的规模差异mt_rand
以及为什么这很重要。即使您每秒生成的 id 少于 10 亿个,您仍然需要选择一种算法,使碰撞几乎不可能,而不仅仅是不太可能。
mt_rand()
每次调用都会返回一个随机数。
但最终,它会返回已经返回给你的号码。这是因为,除了与所需的随机性统计特性一致外,生成器还具有有限的(尽管对于 Mersenne Twister,是非常大的)周期性。如果这种行为是不可取的,那么你最好的选择是使用该生成器来洗牌一个独特的集合。