uniqid函数有固定的长度吗?

4

我在想,有没有人知道PHP中的uniqid函数是否有固定的大小?如果有,它有多少个字符?我有点困惑,因为PHP手册说,当使用扩展熵时,uniqid长度为23个字符。但是根据我的观察,它的长度在26到28个字符之间变化。


我无法复制这个问题。您确定在调用 uniqid 函数时没有提供前缀吗? - eykanal
你能告诉我们你是如何让 uniqid 返回超过23个字符的吗?我们是否在谈论原生的PHP uniqid函数,还是一些模拟GUID的自定义函数? - N.B.
1
哦,你是对的。我真是个白痴:]] 我使用的是:uniqid(rand(), TRUE); ......没有rand()前缀也可以正常工作。谢谢!;) - Ondrej
1个回答

2

我无法确认这种行为:

php -r 'for($i = 0; $i < 1000; $i++) print strlen(uniqid("", true)) . "\n";'

在OS X和Ubuntu上测试PHP 5.3.x,每次迭代产生23个结果。

你使用的操作系统和PHP版本是什么?


正如OP在他的评论中指出的那样:省略前缀应该可以解决问题;)

更详细地说,我们可以查看PHP源代码:https://svn.php.net/viewvc/php/php-src/tags/php_5_3_8/ext/standard/uniqid.c?view=markup,第79行:

spprintf(&uniqid, 0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg(TSRMLS_C) * 10);

如果没有提供前缀并且查找php_combined_lcg的定义,它会返回一个浮点数,其中包含一个前导小数,则uniqid的输出应始终为23个字符长。


你有32位还是64位的php版本?我指的是实际的php,而不是你的操作系统。 - Dmitri Snytkine
@DmitriSnytkine 这很重要,因为……? - Max
这是32位的PHP 5.3.1版本。那是我的错,我使用了一个rand函数作为前缀,所以根据rand函数生成的数字,前缀在26到28个字符之间浮动 ;) - Ondrej
好的,既然我们正在谈论uniqid函数,让我再问你一个问题 - uniqid函数是否适合生成用于哈希函数(hash_hmac等)中使用的盐字符串? - Ondrej
@Ondrej 如果你使用uniqid(mt_rand(), true),我认为那就足够了。然后再用sha1或类似的方法进行哈希处理。 - Max

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