我用PHP生成一个5字母的uniqid:
$id = substr(uniqid(),0,5);
每次我调用它,我都会得到值5004b
。为什么会这样?
如果我删除substr
,则5004b
部分会保持不变,而其余的更改。这不是严重降低了生成的GUID的熵吗?
答案 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