唯一ID只包含数字

Lin*_*nas 1 php unique

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

str_replace(".", "", microtime(true))
Run Code Online (Sandbox Code Playgroud)

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

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

Ami*_*kef 12

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

$id = uniqid(); //58aea16085f6b
Run Code Online (Sandbox Code Playgroud)

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

$id = hexdec( uniqid() ); //1560112880181100
Run Code Online (Sandbox Code Playgroud)

如果它太长时间使用这个但可能得到一些数字:

$id = crc32( uniqid() ); //-1551585806
Run Code Online (Sandbox Code Playgroud)

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

$id = abs( crc32( uniqid() ) ); //1551585806
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个代码片段是受欢迎的,并且可能会提供一些帮助,但是如果它包含一个解释的话会有很大的改进(*meta.stackexchange.com/q/114762)*how*和*why*这解决了这个问题.请记住,您将来会回答读者的问题,而不仅仅是现在要求的人!请[编辑]您的答案以添加说明,并说明适用的限制和假设. (2认同)

Hug*_*ing 5

如果必须基于时间,则可以使用微时间。但我猜你存储的东西在数据库中,所以我投票将去一个primary keyIdauto_increment脚,然后第二列timestamp类型和默认current time

然后,您可以按时间戳排序,即使流量非常高,也具有100%的唯一标识符。但是,如果需要排序(这样就不必在日期之间搜索),那么您就不需要基于时间了。

1、2、3、4的顺序与微秒键的顺序相同,只是更大而且更进一步。

更新

如果它必须是唯一键并且不能从数据库中使用,请尝试以下操作。重复密钥的更改很小,可以忽略。

$key = microtime() + floor(rand()*10000);
Run Code Online (Sandbox Code Playgroud)