PHP - uniqid("",true)与uniqid("")+ mt_rand()

JDe*_*age 1 php mysql security salt

这两种生成顺序但有些独特数字的方法之间的主要区别是什么?我想在MySQL数据库中使用这样一个数字作为唯一的用户ID,也可以作为盐来密码.

我的理解是,对于聚类和索引的原因,这些ID应该是顺序的(我意识到在某些情况下,随机字符串将使两个条目在相同的微秒内非顺序发生,但希望这可以忽略不计.)

Gum*_*mbo 5

不使用更多熵,uniqid基本上做以下(见uniqid.c的来源):

$time = explode(' ', microtime(false));
return sprintf('%s%08x%05x', $prefix, $time[1], $time[0] * 1000000);
Run Code Online (Sandbox Code Playgroud)

因此它基本上以微秒为单位获取当前时间并将它们转换为十六进制表示并将其附加到前缀.这确实已经提供了独特的价值.

但价值观并不是随机的.要获得更多随机值,您应该通过设置第二个参数more_entropy来添加更多熵.在这种情况下,PHP的内部线性同余生成器 php_combined_lcg(参见lgc.c的代码)用于生成一个附加在末尾的伪随机数,增加大约30位的附加熵以使它们更随机.