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

van*_*gen 7 php timestamp microtime

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

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

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

foreach($things as $thing){
    var_dump(microtime());
}
Run Code Online (Sandbox Code Playgroud)

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

dec*_*eze 8

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

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

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

这种有限的使用很可能不会遇到任何问题.

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