php的uniqid是由哪一组字符组成的?
What set of chars is php's uniqid composed of?
我想为 php 的 uniqid
准备简单的正则表达式。我检查了 uniqid 手册寻找用作 return 值的字符集。但是文档只提到:
@return string the unique identifier, as a string.
和
With an empty prefix, the returned string will be 13 characters long. If more_entropy is true, it will be 23 characters.
我想知道 return 值中可以包含哪些字符。它是十六进制字符串吗?如何确定?在哪里可以找到更多关于 uniqid 函数的信息?
我在 php 网站上找到了这个:http://www.php.net/manual/en/function.uniqid.php#95001
如果这是真的,那么 13 个字符的版本完全是十六进制的。
然而,23 个字符的版本有:
- 14 个字符(十六进制)
- 然后一个点
- 然后另外8个字符(十进制)
如果你需要完全确定,你可以自己验证一下:http://sandbox.onlinephpfunctions.com/code/c04c7854b764faee2548180eddb8c23288dcb5f7
文档没有指定字符串内容;只有它的长度。一般来说,你不应该依赖它。如果在一对定界符(如引号)之间打印值,则可以在正则表达式中使用它们:
"([^"]+)" ( 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);
}
这为您提供了两种可能的输出格式:
uniqid()
- 13 个字符,hexadecimal number
uniqid('', true)
- 14 - 23 个字符,hexadecimal number with floating number suffix
computed elsewhere
如果您使用除字母数字字符和点以外的其他分隔符,您可以使用这些简单的正则表达式之一来获取两种格式之一的值:
[0-9a-f]+
[.0-9a-f]+
如果您需要任何 PHP 版本的 100% 格式保证,您可以根据 sprintf
.
编写自己的函数
我承认,uniqid
不太可能发生重大变化;我希望创建其他扩展以提供不同的格式。 Another comment in uniqid
documentation shows a RFC 4211 compliant UUID implementation. There was also a discussion on Whosebug about it.
我想为 php 的 uniqid
准备简单的正则表达式。我检查了 uniqid 手册寻找用作 return 值的字符集。但是文档只提到:
@return string the unique identifier, as a string.
和
With an empty prefix, the returned string will be 13 characters long. If more_entropy is true, it will be 23 characters.
我想知道 return 值中可以包含哪些字符。它是十六进制字符串吗?如何确定?在哪里可以找到更多关于 uniqid 函数的信息?
我在 php 网站上找到了这个:http://www.php.net/manual/en/function.uniqid.php#95001
如果这是真的,那么 13 个字符的版本完全是十六进制的。 然而,23 个字符的版本有:
- 14 个字符(十六进制)
- 然后一个点
- 然后另外8个字符(十进制)
如果你需要完全确定,你可以自己验证一下:http://sandbox.onlinephpfunctions.com/code/c04c7854b764faee2548180eddb8c23288dcb5f7
文档没有指定字符串内容;只有它的长度。一般来说,你不应该依赖它。如果在一对定界符(如引号)之间打印值,则可以在正则表达式中使用它们:
"([^"]+)" ( 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);
}
这为您提供了两种可能的输出格式:
uniqid()
- 13 个字符,hexadecimal numberuniqid('', true)
- 14 - 23 个字符,hexadecimal number with floating number suffix computed elsewhere
如果您使用除字母数字字符和点以外的其他分隔符,您可以使用这些简单的正则表达式之一来获取两种格式之一的值:
[0-9a-f]+
[.0-9a-f]+
如果您需要任何 PHP 版本的 100% 格式保证,您可以根据 sprintf
.
我承认,uniqid
不太可能发生重大变化;我希望创建其他扩展以提供不同的格式。 Another comment in uniqid
documentation shows a RFC 4211 compliant UUID implementation. There was also a discussion on Whosebug about it.