【发布时间】:2014-11-13 22:28:04
【问题描述】:
我正在尝试生成唯一的令牌 ID,我可以使用mt_rand()吗?
mt_rand() 会生成两次相同的数字吗?
【问题讨论】:
标签: php random mersenne-twister
我正在尝试生成唯一的令牌 ID,我可以使用mt_rand()吗?
mt_rand() 会生成两次相同的数字吗?
【问题讨论】:
标签: php random mersenne-twister
mt_rand 会生成两次相同的数字,是的。每个随机数生成器可能最终都会这样做。 (理论上)每次运行生成器时,每个数字都有相同的机会生成。它可以连续多次随机生成相同的数字。这是随机的。
要为唯一 ID 使用随机数生成器,两次生成相同数字的概率必须非常低,以至于在实践中是无关紧要的。在这方面,mt_rand 可能还不够。随机生成的唯一 ID 的概念已正式化为 UUIDs,您应该将其用于通用唯一 ID。
...仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%。
由于mt_rand 在 32 位系统上返回一个 32 位整数,它只能返回 2^32 个唯一值,也就是只有 4,294,967,296 个唯一值。如果您每秒生成 10 亿个 mt_rand 值,那么您基本上保证在 4 秒后重复。这有望说明 UUID 和 mt_rand 之间的规模差异以及为什么这很重要。即使您每秒生成的 id 远少于 10 亿个,您仍然需要选择一种算法,使碰撞几乎不可能发生,而不仅仅是不太可能发生。
【讨论】:
uniqid 不是一个 UUID 实现!不是很好!
mt_rand()有什么不同?
mt_rand() 将在每次调用时返回一个随机数。
但最终,它会返回已经返回给您的数字。这是因为,除了与所需的随机性统计特性一致外,生成器还具有有限的(尽管对于 Mersenne Twister,非常大)周期性。如果这种行为是不可取的,那么最好的办法是使用该生成器来洗牌一个独特的集合。
【讨论】:
这是我第一次回答with just a comic 的问题,因为它是正确的答案:
【讨论】: