2

我以这种方式在 PHP 中生成 5 个字母的 uniqid:

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

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

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

4

5 回答 5

5

uniqid() 是基于 microtime() 的,开头会很长一段时间都是一样的。

我的建议是,如果您需要一个 5 位长的 uniqid,您只需每次增加或增加什么。

于 2012-07-17T01:03:15.497 回答
3

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

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

但是,一秒钟后,您将获得重复值。你真的应该把完整的uniqid()

于 2012-07-17T01:26:28.333 回答
0

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

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

于 2014-04-04T11:45:38.050 回答
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
于 2015-01-29T07:28:41.173 回答
0

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

于 2012-07-17T01:23:24.697 回答