簡體   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