Uniqid每次返回相似的值

时间:2012-07-17 00:56:02

标签: php

我用PHP生成一个5字母的uniqid:

$id = substr(uniqid(),0,5);

每次我调用它,我都会得到值5004b。为什么会这样?

如果我删除substr,则5004b部分会保持不变,而其余的更改。这不是严重降低了生成的GUID的熵吗?

5 个答案:

答案 0 :(得分:4)

uniqid()基于microtime(),很长一段时间开始是相同的。

我的建议是,如果你需要一个长5位的uniqid,你每次都会增加。

答案 1 :(得分:3)

uniqid()仅在您获取全部价值时才有效。采用最后五个字符而不是第一个字符会更有意义:

$id = substr(uniqid(),-5);

然而,在一秒之后你会得到重复的值。你真的应该采取完整的uniqid()

答案 2 :(得分:0)

要增加输出的熵,可以使用uniqid('', true);。根据文档,这将“在返回值的末尾添加额外的熵(使用组合的线性同余生成器),这增加了结果唯一的可能性。”

答案 3 :(得分:0)

如果您需要唯一ID,请不要使用uniqid(),因为它只会根据当前时间返回ID。如果您的计算机足够快,它将一次又一次地产生相同的值。

扩大熵(通过传递" true"作为第二个参数)有帮助,但它无法隐藏这个函数有缺陷的事实,并且不应该在脚本中多次使用。

答案 4 :(得分:0)

你可以使用像substr(uniqid(rand(),1),0,7)这样的东西。这会从随机种子中生成唯一ID。然后,如果您将它们保存到数据库,您可能需要在再次生成之前检查它们是否存在。做类似的事情:

function idExists($id){
//query database and check if the id already exists
}
//then use this to generate
$id=null;
   do{
$id=substr(uniqid(rand(),1),0,7); 
}while(idExists($id));
//then you get your unique id here