是以微秒为单位的时间戳始终是唯一的.PHP中的


Is a timestamp in microseconds always unique?

uniqid()基于当前时间戳生成一个唯一的ID(以微秒为单位)。这真的是生成唯一ID的万无一失的方法吗?

即使假设有一个用户在运行一个脚本,并且循环以微秒为单位生成时间戳,理论上还能保证它是不正确的吗?在实践中,这种可能性完全可以忽略不计吗?

为了清晰起见,假设你的循环无非是这样的:

foreach($things as $thing){
    var_dump(microtime());
}

它在理论上有可能不是独一无二的吗?如果有,它在实践中的现实程度如何?

基于微秒的id只能保证在限制范围内是唯一的。在这方面,在一台计算机上使用单线程脚本可能是非常安全的。然而,一旦你开始谈论并行执行,无论是在同一台机器内的多个CPU上,还是在多台机器上,所有的赌注都会落空

所以这取决于你想用这个id做什么。如果你只是用它来生成一个只在同一个脚本中使用的id,那么它可能足够安全。例如:

<?php $randomId = uniqid(); ?>
<div id="<?php echo $randomId; ?>"></div>
<script>
    var div = document.getElementById('<?php echo $randomId; ?>');
    ...
</script>

您很可能不会在这里遇到任何问题,使用这种有限的用途。

但是,如果您开始使用uniqid或其他与其他外部脚本共享的类似用途生成文件名,我不会依赖它。对于文件名,使用基于文件内容的哈希可能是个好主意。对于通用的去中心化随机生成的id,UUID非常适合(因为它们是为此目的设计的)。

首先问问自己为什么需要uniqid。例如,我使用uniquid作为上传到我的网站的文件名。可以有任意数量的用户同时上传,所以我关心的是两个或多个具有相同id的文件,但我知道一个用户一次只能上传一个文件。所以,我在前面预先准备了用户名,并且永远具有唯一性。

echo uniqid('username-'); // username-5621e3335ac0c

当然,你首先应该问问自己是否需要使用uniquid。如果你知道你创建id的原因只能每x秒、分钟等发生一次,那么你可以用同样的方式创建id,只需使用时间:

echo 'username-'.time(); // username-1445062025