php - 以微秒为单位的时间戳是否总是唯一的?

标签 php timestamp microtime

PHP 中的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,UUIDs很合适(因为它们就是为此目的而设计的)。

关于php - 以微秒为单位的时间戳是否总是唯一的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882872/

相关文章:

php - 如何通过本地主机在同一台 PC 上同时运行 Microsoft IIS 和 WAMP

javascript - 使用 Javascript 变量作为 WP_Query 参数

javascript - 标记不显示在谷歌地图 API 上

mysql - 将文本时间戳转换为 MySQL 中所有行的日期时间

php - 如何简单地更新 mysql 中的特定时间戳?

Windows microtime() 行为上的 PHP 5.5

javascript - 将 microtime(true) 转换为 javascript 日期对象

php - PHP 组合两个数组

mysql - 为什么 MySQL unix 时间没有达到 32 位无符号整数限制?