[英]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是唯一的,但是與任何隨機字符串一樣,您越短越容易發生碰撞。
您的代碼返回哈希的一部分。 散列用於散列,因此您不能保證結果中的任何模式(例如,唯一性)。
另外,您僅獲得哈希的一部分,哈希中的每個字母均為十六進制(從0
到9
或從a
到b
-16的可能性)。 它只需要一個簡單的計算:
16 ^ 8 = 4 294 967 296
查找代碼可以生成多少個唯一值。 此數字( 4 294 967 296
)表示,如果您使用此功能的次數超過4 294 967 296次,則使用它生成的值肯定不會唯一 。 當然可以肯定的是,在這種情況下,將迭代次數應用於較小數量的值后,迭代次數將不是唯一的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.