我以这种方式在 PHP 中生成 5 个字母的 uniqid:
$id = substr(uniqid(),0,5);
每次我调用它时,我都会得到 value 5004b
。为什么会这样?
如果我删除substr
,则该5004b
部分保持不变,而其余部分发生变化。这不是严重降低了正在生成的 GUID 的熵吗?
我以这种方式在 PHP 中生成 5 个字母的 uniqid:
$id = substr(uniqid(),0,5);
每次我调用它时,我都会得到 value 5004b
。为什么会这样?
如果我删除substr
,则该5004b
部分保持不变,而其余部分发生变化。这不是严重降低了正在生成的 GUID 的熵吗?
uniqid() 是基于 microtime() 的,开头会很长一段时间都是一样的。
我的建议是,如果您需要一个 5 位长的 uniqid,您只需每次增加或增加什么。
uniqid()
仅当您获得全部价值时才有效。取最后五个字符而不是第一个字符会更有意义:
$id = substr(uniqid(),-5);
但是,一秒钟后,您将获得重复值。你真的应该把完整的uniqid()
。
如果您需要唯一 ID,请不要使用 uniqid(),因为它仅返回基于当前时间的 ID。如果您的计算机足够快,它将一次又一次地产生相同的值。
扩大熵(通过传递“true”作为第二个参数)会有所帮助,但它不能隐藏这个函数有缺陷的事实,并且不应在脚本中多次使用。
你可以使用类似 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
要增加输出的熵,可以使用uniqid('', true);
. 根据文档,这“将在返回值的末尾添加额外的熵(使用组合的线性同余生成器),这增加了结果唯一的可能性。”