PHP - uniqid(“”,true)与uniqid(“”)+ mt_rand()

时间:2011-03-31 10:34:39

标签: php mysql security salt

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

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

2 个答案:

答案 0 :(得分:5)

如果不使用更多熵,uniqid基本上会执行以下操作(请参阅source of uniqid.c):

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

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

但价值并不是随机的。要获得更多随机值,您应该通过设置第二个参数 more_entropy 来添加更多熵。在这种情况下,PHP的内部linear congruential generator php_combined_lcg(参见source of lgc.c)用于生成最后附加的伪随机数,增加大约30位额外的熵以使它们更多随机的。

答案 1 :(得分:2)

(抓住这个,错误信息,对不起)

所以是的,正如Gumbo指出的那样,它不是一个哈希,而是一个微秒级的分辨率增加计时器值,可选地与一个随机数连接。因此,这些值仍然不是连续的,但至少是稳定的。 这两种方法之间的差异非常小。

这个仍然有用:如果你需要唯一的顺序号码,而你使用MySQL,请使用自动增量字段,他们就是这样做的。