唯一ID只包含数字

时间:2012-12-18 11:46:05

标签: php unique

我需要时间基于唯一 ID,它只包含数字,我想只是使用这样的东西:

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

我会将这个ID用于很多事情,例如评论发布,我期待非常高的流量,所以我想知道与microtime功能发生冲突的可能性有多高?

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

4 个答案:

答案 0 :(得分:11)

你可以使用它来获得uniqid但不是数字:

$id = uniqid(); //58aea16085f6b

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

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

如果它太长时间使用它,但可能会得到一些新的数字:

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

如果你只是需要有姿势的数字,你可以这样做:

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

答案 1 :(得分:5)

如果必须基于时间,您可以使用microtime。但我想你是把东西存放在一个数据库中所以我的投票将是primary keyId auto_increment,然后是第二列timestamp类型和默认{ {1}}。

然后您可以对时间戳进行排序,即使流量极高,也可以拥有100%唯一标识符。但如果需要订购(所以不要在日期之间搜索),那么你根本不需要它。

1,2,3,4将与微缩时键的顺序相同,只是更大,更进一步。

更新

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

current time

答案 2 :(得分:0)

如果你必须避免碰撞时间基础将无法正常工作。最终你会发生碰撞。为什么不使用带信号量的计数器。

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

答案 3 :(得分:0)

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

$id = getTimeId();

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

我会留给你好先生,享受让它递归。