PHP的uniqid函数由哪些字符组成?

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

@return string 返回唯一标识符,作为字符串。

以及

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

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

2个回答

3

文档未指定字符串内容,仅指定其长度。通常情况下,您不应该依赖它。如果您在一对分隔符(如引号)之间打印值,则可以在正则表达式中使用它们:

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

只要您为特定的PHP版本开发,就可以检查其实现并假设它不会改变。如果您升级了,应该检查这个假设是否仍然有效。 “uniqid”文档中的注释描述了它基本上是一个十六进制数,带有可选的数字后缀。
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个字符,十六进制数字
  2. uniqid('', true) - 14 - 23个字符,带有浮点数后缀的十六进制数字 在其他地方计算

如果你使用的分隔符不是字母数字字符和点号,你可以使用以下其中一种简单的正则表达式来获取任一两种格式中的值:

  1. [0-9a-f]+
  2. [.0-9a-f]+
如果您需要PHP的任何版本都可以保证100%格式,您可以基于sprintf编写自己的函数。
我承认,uniqid的变化不太可能会显着改变; 我期望创建其他扩展提供不同的格式。 “uniqid”文档中的另一个评论 显示符合RFC 4211标准的UUID实现。还有 关于此的stackoverflow讨论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接