1

我正在尝试生成唯一的令牌 ID,我可以使用mt_rand()吗?

mt_rand()产生两次相同的数字吗?

4

4 回答 4

14

这是我第一次用漫画来回答问题,因为它是正确的答案:

在此处输入图像描述

Dilbert.com 上的原件

于 2014-09-19T10:41:56.853 回答
2

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 亿个,您仍然需要选择一种算法,使碰撞几乎不可能,而不仅仅是不太可能。

于 2014-09-19T10:44:19.380 回答
0

mt_rand()每次调用都会返回一个随机数。

但最终,它会返回已经返回给你的号码。这是因为,除了与所需的随机性统计特性一致外,生成器还具有有限的(尽管对于 Mersenne Twister,是非常大的)周期性。如果这种行为是不可取的,那么你最好的选择是使用该生成器来洗牌一个独特的集合。

于 2014-09-19T10:41:20.517 回答
0

mt_rand()有以下注意事项:

注意:此函数不会生成加密安全值,不应用于加密目的。如果您需要加密安全值,请考虑改用 openssl_random_pseudo_bytes()。

注意:当最大值超过 2^32 时,mt_rand() 返回值的分布在 64 位 PHP 版本上偏向偶数。

如果你对它不完全没有偏见感到满意,你应该没问题。

但是,如果是这样,你为什么不使用uniqid

于 2014-09-19T10:55:07.753 回答