【发布时间】:2011-07-26 18:58:37
【问题描述】:
这两种生成顺序但有些独特的数字的方法之间的主要区别是什么?我想使用这样的数字作为 MySQL 数据库中的唯一用户 ID,也想作为盐来加盐密码。
我的理解是,出于集群和索引的原因,这些 ID 应该是连续的(我意识到在某些情况下,随机字符串会使发生在同一微秒内的两个条目不连续,但希望这可以忽略不计。)
【问题讨论】:
这两种生成顺序但有些独特的数字的方法之间的主要区别是什么?我想使用这样的数字作为 MySQL 数据库中的唯一用户 ID,也想作为盐来加盐密码。
我的理解是,出于集群和索引的原因,这些 ID 应该是连续的(我意识到在某些情况下,随机字符串会使发生在同一微秒内的两个条目不连续,但希望这可以忽略不计。)
【问题讨论】:
(划掉这个,错误的信息,对不起)
所以是的,正如 Gumbo 指出的那样,它不是散列,而是确实是微秒分辨率增加的计时器值,可选地与随机数连接。因此,这些值仍然不是连续的,但至少是稳定的。 这两种方法之间的差异将非常小。
这个仍然成立:如果您需要唯一的顺序数字,并且您使用 MySQL,请使用自动增量字段,他们就是这样做的。
【讨论】:
uniqid 根本不做任何散列。它会生成独一无二的值。
在不使用更多熵的情况下,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 位的额外熵以使其更加随机。
【讨论】: