2011-03-31 104 views
1

这两种方法之间的主要区别在于生成顺序但有点独特的数字?我想在MySQL数据库中使用这样一个数字作为一个唯一的用户ID,也可以作为一个盐来密码。PHP - uniqid(“”,true)与uniqid(“”)+ mt_rand()

我的理解是,集群和索引的原因,这些ID应该是连续的(我认识到,在某些情况下,随机字符串将使该发生在同一个微秒非连续的两个条目,但希望这是可以忽略不计。)

回答

2

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

这个仍然成立:如果你需要独特的顺序数字,并且你使用MySQL,使用自动增量字段,他们就是这样做的。

+1

'uniqid'完全不做任何散列。它会生成独特的值。 – Gumbo 2011-03-31 11:13:13

+1

哦,我,你完全正确...我从哪里得到的。 – Damon 2011-03-31 11:16:04

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 generatorphp_combined_lcg(请参阅source of lgc.c)用于生成一个伪随机数,该伪随机数在最后附加,增加大约30位额外的熵以使它们更随机。