簡體   English   中英

PHP的唯一ID

[英]Unique ID with PHP

我寫這行簡單代碼來每次都獲得隨機且唯一的代碼(僅8個字符):


echo substr(md5(uniqid(rand(), true)),0,8);

輸出:

077331e5
5af425b1
0fc7dcf2
...

我問我是否永遠不會發生碰撞(重復)。 否則可能會發生。

BS:
最好使用time()嗎?


echo substr(md5(uniqid(time(), true)),0,8);

哈希可能會發生沖突。 通過獲取哈希的子字符串,您只是在增加發生這種情況的機會。

不管您輸入md5()的內容是什么,通過執行子字符串,您都將消除md5的大部分輸出,並限制了可能的哈希范圍。 md5輸出一個128bit的字符串,而您將其限制為32bits,因此,發生碰撞的幾率從1x10 ^ 38的1到40億的1。

您的“唯一代碼”是由八個十六進制數字組成的字符串,因此它具有4294967296個可能的值。 因此,在第4294967297次運行該命令時,您會得到一個早期代碼的副本。

PHP有一種提供唯一ID的方法,稱為uniqid()

您很有可能會發現8位字符MD5是唯一的,但是與任何隨機字符串一樣,您越短越容易發生碰撞。

簡短的回答:可能會發生。 有一個討論, 在這里了您可能要檢查MD5碰撞的空間。 對MD5進行子字符串處理將使碰撞空間大得多。

此處提出的答案可能是一個更好的解決方案,可能將其與您生成的其他唯一ID進行比較。

您的代碼返回哈希的一部分。 散列用於散列,因此您不能保證結果中的任何模式(例如,唯一性)。

另外,您僅獲得哈希的一部分,哈希中的每個字母均為十六進制(從09或從ab -16的可能性)。 它只需要一個簡單的計算:

16 ^ 8 = 4 294 967 296

查找代碼可以生成多少個唯一值。 此數字( 4 294 967 296 )表示,如果您使用此功能的次數超過4 294 967 296次,則使用它生成的值肯定不會唯一 當然可以肯定的是,在這種情況下,將迭代次數應用於較小數量的值后,迭代次數將不是唯一的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM