使用time()函数生成唯一ID

6

如果我使用:

$t = time();
echo $t;

这将输出类似于:1319390934

我有两个问题:

  1. 这个值可以用作唯一标识吗?
  2. 如何从中生成日期?

我不能使用uniqid(),因为我需要一个可用于排序(最近)的值。


在什么情况下是唯一的?你是如何使用这个ID的?(microtime()通常也用于生成唯一的ID)。 - Jared Farrish
像 SQL 中的唯一索引一样,它是一个不可重复的数字。 - user947462
为什么不使用数据库自增? - maaudet
1
不,我的意思是,你想要防止每个用户之间的行冲突,还是所有用户之间的行冲突?或者是其他条件?你需要一个唯一的ID用来做什么? - Jared Farrish
顺便提一下,uniqid 也是有序的。它基本上只是一个编码后的微秒时间戳。 - NikiC
为什么它们需要被排序? - middus
4个回答

15

使用time(),将会给您一种可排序的方式来创建唯一的ID。串联字符串也可以进一步随机化您所需的结果,同时仍然保持可排序性:

$uniqueId= time().'-'.mt_rand();

2
是的,请确保您使用了 mt_rand 函数,否则如果两个或更多用户恰好在同一时间访问,它们可能会具有相同的唯一 ID。 - Mike

4
  1. 显然这不能用作“唯一”的标识符,因为它在同一秒钟内不是唯一的。
  2. 查看date函数。

如果您想要一个被宣传为唯一标识符并且可以排序的东西,您可以使用像这样涉及uniqid的东西:

$u = time().'-'.uniqid(true);

我这里可能过于简化了,假设所有的 time 值都有相同的位数(这样字符串排序将产生与自然排序相同的结果)。如果您不想做出这种假设,那么可以考虑

$u = sprintf("%010s-%s", time(), uniqid(true));

由于这是针对数据库的,一个与NOW()列配对的auto_increment列也可以工作,具体取决于使用情况。 - Jared Farrish

1
如果您在具有唯一ID的用户帐户环境中使用此代码,可以将time()附加到其帐户ID以生成唯一ID。
您可以使用以下方法将time()转换回日期字符串:
$time = time();
echo 'The datestamp for (' . $time . ') is ' . date("Y-m-d", $time);

当然,使用PHP的date()格式可以更改日期格式。


0

我可能会这样做:

$id = microtime();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接