什么样的字符集是php的uniqid组成的?

时间:2016-12-31 12:42:51

标签: php uniqueidentifier

我想为php的uniqid准备简单的正则表达式。我检查了uniqid手册,查找用作返回值的字符集。但文档只提到:

  

@return将唯一标识符字符串作为字符串。

  

使用空前缀,返回的字符串长度为13个字符。如果more_entropy为true,则为23个字符。

我想知道返回值中我可以期待哪些字符。它是十六进制字符串吗?如何确定?哪里可以找到关于uniqid函数的更多信息?

2 个答案:

答案 0 :(得分:3)

文档未指定字符串内容;只有它的长度。一般来说,你不应该依赖它。如果在一对分隔符(如引号)之间打印值,则可以在正则表达式中使用它们:

"([^"]+)"    ($1 contains the value)

只要您针对特定的PHP版本进行开发,就可以检查其实现并假设它不会发生变化。如果升级,则应检查假设是否仍然有效。

A comment in uniqid documentation描述它本质上是一个带有可选数字后缀的十六进制数字:

if (more_entropy) {
    uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
} else {
    uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
}

这为您提供了两种可能的输出格式:

  1. uniqid() - 13个字符,hexadecimal number
  2. uniqid('', true) - 14 - 23个字符,hexadecimal number with floating number suffix computed elsewhere
  3. 如果使用除字母数字字符和点之外的其他分隔符,则可以使用以下简单正则表达式之一来获取以下两种格式之一的值:

    1. [0-9a-f]+
    2. [.0-9a-f]+
    3. 如果您需要100%格式保证任何PHP版本,您可以根据sprintf编写自己的函数。

      我承认,uniqid不太可能发生显着变化;我希望创建其他扩展来提供不同的格式。 Another comment in uniqid documentation显示符合RFC 4211的UUID实现。还有一个讨论on stackoverflow about it

答案 1 :(得分:0)

我在php网站上发现了这个:http://www.php.net/manual/en/function.uniqid.php#95001

如果可以相信,则13个字符版本完全是十六进制。 但是23个字符的版本有:

  • 14个字符(十六进制)
  • 然后是一个点
  • 然后另外8个字符(十进制)

如果您需要完全确定,可以自行验证:http://sandbox.onlinephpfunctions.com/code/c04c7854b764faee2548180eddb8c23288dcb5f7