【问题标题】:Uniqueness: `time()` Vs `mt_rand()`唯一性:`time()` 与 `mt_rand()`
【发布时间】:2011-11-27 13:29:41
【问题描述】:

在 php 中生成唯一编号时,我总是无法确定这一点。

time() 是否比 mt_rand() 更独特?

time() 对我来说似乎更独特,因为时间日期不能在时间上重复两次。

mt_rand()我不确定php默认提供的唯一整数 - 是否会及时重复唯一整数?

【问题讨论】:

  • 选择还取决于您要将这些数字用于什么目的...
  • 只想像 'AUTO_INCREMENT' 一样使用它,您可以在 MySQL 中创建页面或产品 ID。我不能使用 'AUTO_INCREMENT' 作为 ID 唯一性,因为我有两个共享相同信息的表。
  • 你不能只在其中一个表上使用AUTO_INCREMENT,然后将生成的 id 用于另一个表吗? mysql_insert_id 可以提供帮助。

标签: php time random php-5.3


【解决方案1】:

你考虑过uniqid() 吗?

另外,回答您的实际问题:与time() 不同,mt_rand 最终肯定会重复一个数字。但是,如果您希望 time() 是唯一的,您只能每秒使用一次。

【讨论】:

  • 是的,但是一个 uniqid,例如:4b3403665fea6 包含字母...我只想要整数。谢谢。
  • 好吧,你可以使用base_convert like: base_convert(uniqid(),16,10) 这将使它成为一个独特的int
  • 哦,我想补充一点,整数确实很高。如果您使用的是 32 位系统,您可能希望 substr() 关闭 uniqid() 的前 2 个字节。
  • 谢谢汤姆!我能问为什么1610 而不是其他数字吗?
  • 它将 base16 转换为 base10 - 也称为十六进制 (uniqid) 到 int。
【解决方案2】:

如果您有很多用户同时使用time(),您可能会在同一秒内发生两个事件,从而使time() 不像mt_rand() 那样独特。使用mt_rand(),您几乎可以保证获得独特的结果,但您可能不会。

另一种解决方案是使用microtime(),它以微秒为单位返回当前时间,这将为您提供独特的标记,因为在同一微秒中发生的事件是非同寻常的。您还可以考虑uniqid(),它从当前时间以微秒为单位生成一个ID(很可能在内部使用microtime()

【讨论】:

    【解决方案3】:

    mt_rand 可以两次生成相同的值,但您可以考虑其概率,其中 time 返回自 unix 纪元以来的秒数,并且不能重复两次。但它每秒都在变化,这意味着如果在一秒钟内调用多次,它将返回相同的结果,而 mt_rand 可能会返回不同的值。

    【讨论】:

      【解决方案4】:

      对于唯一 ID,使用 time() 通常不是一个好主意,原因如下:

      1. 不同的操作系统可能有不同的时间分辨率,因此您可能会得到 2 个完全相同的连续 ID
      2. 这可能无关紧要,但猜测基于时间的 ID 要容易得多

      【讨论】:

      • 即使所有“随机”数字都是基于当前时间。这就是为什么随机性不存在并且所有随机性实际上都是伪随机性的原因。但是很真实! +1
      • 并非所有的随机发生器都是基于时间的(尽管大多数都是),有些是基于温度的,在极少数情况下 - 量子隧道。但更重要的是,它们在数学上更难相互推断,这才是真正的要点。
      • 温度 =) Kewl!不知道。
      猜你喜欢
      • 2011-12-13
      • 2011-04-29
      • 2011-07-26
      • 2015-03-23
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多