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