时间戳以微秒为单位始终是唯一的吗?

时间:2014-11-12 08:57:51

标签: php timestamp microtime

PHP中的uniqid()根据当前时间戳(以微秒为单位)生成唯一ID。这真的是一种生成唯一ID的简单方法吗?

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

为清楚起见,请说你的循环只不过是:

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

是否有任何理论上的机会它可能不是唯一的,如果是这样,它在实践中有多现实?

2 个答案:

答案 0 :(得分:8)

基于微秒的id仅保证在限制范围内是唯一的。在这方面,单台计算机上的单线程脚本可能非常安全。但是,一旦你开始讨论并行执行,只需在同一台机器内的多个CPU上,或者特别是在多台机器上,所有的赌注都会关闭。

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

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

这种限制使用很可能不会遇到任何问题。

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

答案 1 :(得分:1)

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

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

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

{{1}}