繁体   English   中英

mt_rand()是否两次生成相同的数字?

[英]Does mt_rand() generate same number twice?

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

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

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

在此处输入图片说明

原件在Dilbert.com上

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亿个ID,您仍然需要选择一种算法,该算法实际上使碰撞成为不可能,而不仅仅是不可能。

mt_rand()将在每次调用时返回一个随机数。

但最终,它将返回已经返回给您的号码。 这是因为,除了与所需的随机性统计特性保持一致之外,生成器还具有有限的(尽管对于Mersenne Twister而言,这是非常大的) 周期性 如果这种行为是不受欢迎的,那么最好的选择就是使用该生成器来随机播放一个唯一的集合。

mt_rand()具有以下警告:

警告 :此函数不会生成加密的安全值,并且不应将其用于加密目的。 如果需要加密安全的值,请考虑改用openssl_random_pseudo_bytes()。

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

如果您对它没有完全的偏见感到满意,则应该没事。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM