我需要时间基于唯一 ID,它只包含数字,我想只是使用这样的东西:
str_replace(".", "", microtime(true))
我会将这个ID用于很多事情,例如评论发布,我期待非常高的流量,所以我想知道与microtime
功能发生冲突的可能性有多高?
也许有更好的方法来获得数字唯一ID?请记住,它必须基于时间,因此可以进行排序。
答案 0 :(得分:11)
你可以使用它来获得uniqid但不是数字:
$id = uniqid(); //58aea16085f6b
使用它将其转换为仅数字:
$id = hexdec( uniqid() ); //1560112880181100
如果它太长时间使用它,但可能会得到一些新的数字:
$id = crc32( uniqid() ); //-1551585806
如果你只是需要有姿势的数字,你可以这样做:
$id = abs( crc32( uniqid() ) ); //1551585806
答案 1 :(得分:5)
如果必须基于时间,您可以使用microtime。但我想你是把东西存放在一个数据库中所以我的投票将是primary key
列Id
auto_increment
,然后是第二列timestamp
类型和默认{ {1}}。
然后您可以对时间戳进行排序,即使流量极高,也可以拥有100%唯一标识符。但如果需要订购(所以不要在日期之间搜索),那么你根本不需要它。
1,2,3,4将与微缩时键的顺序相同,只是更大,更进一步。
更新
如果它必须是唯一键并且无法从数据库中使用,请尝试以下操作。重复键的变化非常小,可以忽略不计。
current time
答案 2 :(得分:0)
如果你必须避免碰撞时间基础将无法正常工作。最终你会发生碰撞。为什么不使用带信号量的计数器。
答案 3 :(得分:0)
如果您需要使用基于纯时间的ID,您需要确保避免冲突,以便a)在数据库中使用主键,然后b)使用递归检查以确保您的基于时间的ID尚未采取:
$id = getTimeId();
function getTimeId() {
// Generate microtime
// Query to ensure it does not exist
// Return microtime
}
我会留给你好先生,享受让它递归。