2

我需要获取仅由数字组成的基于时间唯一ID,我想简单地使用这样的东西:

str_replace(".", "", microtime(true))

我会将此 id 用于许多事情,例如评论发布,并且我预计流量会很高,所以我想知道与microtime功能发生冲突的可能性有多大?

也许有更好的方法来获取数字唯一ID?请记住,它必须基于时间,以便进行排序。

4

4 回答 4

19

您可以使用它来获取 uniqid 但不是数字:

$id = uniqid(); //58aea16085f6b

使用它来将其仅转换为数字:

$id = hexdec( uniqid() ); //1560112880181100

如果它太长使用这个但可能会得到负数:

$id = crc32( uniqid() ); //-1551585806

如果您只需要积极的数字,您可以这样做:

$id = abs( crc32( uniqid() ) ); //1551585806
于 2017-02-18T11:48:20.537 回答
5

如果它必须基于时间,您可以使用微时间。但我猜你正在将东西存储在数据库中,所以我的投票会选择一个带有type 和一个 default的primary keyIdauto_increment然后是第二个列。timestampcurrent time

然后您可以按时间戳排序,即使流量非常大,也可以拥有 100% 的唯一标识符。但是,如果需要订购(所以不要在日期之间搜索),那么您就不需要根据时间进行订购。

1, 2, 3, 4 的顺序与 microtime 键的顺序相同,只是更大更远。

更新

如果它必须是唯一键并且不能从数据库中使用,请尝试以下操作。重复键的变化非常小,可以忽略不计。

$key = microtime() + floor(rand()*10000);
于 2012-12-18T11:48:51.940 回答
0

如果你必须避免基于时间的碰撞是行不通的。最终你会发生碰撞。为什么不使用带有信号量的计数器。

http://php.net/manual/en/book.sem.php

于 2012-12-18T11:50:12.663 回答
0

如果您需要使用纯基于时间的 ID,则需要确保避免冲突,因此 a) 在数据库中使用主键,然后 b) 使用递归检查以确保您的基于时间的 ID 尚未被使用:

$id = getTimeId();

function getTimeId() {
    // Generate microtime
    // Query to ensure it does not exist
    // Return microtime
}

我将把它留给你,好先生,享受使它递归的乐趣。

于 2012-12-18T12:01:15.210 回答