循环中不唯一id的可能性是什么

时间:2014-01-29 11:55:33

标签: php

我循环遍历一个数组,并为每个记录生成uniqid的唯一标识符:

foreach($emailsByCampaign as $campaign => $emails) {
    $campaignHex = $this->strToHex($campaign);
    $values = "(";
    for ($i=0; $i<sizeof($emails);$i++) {
        $values .= $analyticsDbInstance->escape($emails[$i]) . ",'" . uniqid(true) . "'), (";
    }
}

官方文档指出uniqid基于微秒生成id。循环的两个循环可能在不到两秒的时间内通过,这将导致不唯一的ID?

1 个答案:

答案 0 :(得分:4)

uniqid()根据自Unix时代开始 - 1970年1月1日以来的微秒数生成一个值。在一台机器上,每个ID都是唯一的。两个独立的机器可能(但不太可能)生成相同的uniqid(),在这种情况下,可以使用前缀和熵参数来避免这种情况。

PHP中有许多UUID(或GUID)的实现,但这些实现通常会生成V4 UUID,这些UUID不能保证是唯一的(但碰撞的可能性很小)

如果您需要生成更安全的内容,可以使用openssl-random-pseudo-bytes()