2011-11-27 71 views
1

我总是无法确定这是什么时候生成唯一的数字在PHP中。唯一性:`时间()`Vs`mt_rand()`

time()mt_rand()更独特吗?

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

mt_rand()我不确定PHP的默认唯一整数提供 - 将一个独特的整数在时间上重复吗?

+2

这个选择还取决于你想要使用这些数字的目的... – deceze

+0

只需要像'AUTO_INCREMENT'那样使用它,你可以在MySQL中创建一个页面或产品ID。我不能使用'AUTO_INCREMENT'作为ID唯一性,因为我有两个表共享相同的信息。 – laukok

+1

你不能在其中一个表上使用'AUTO_INCREMENT',并使用生成的id作为另一个表吗? 'mysql_insert_id'可以提供帮助。 – poke

回答

2

您考虑过uniqid()吗?

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

+0

是的,但一个uniqid,如:4b3403665fea6包含字母......我只是想要整数。谢谢。 – laukok

+0

那么,你可以使用'base_convert'如:'base_convert(uniqid(),16,10)'这将使它成为一个唯一的int –

+0

哦,我想补充说的是,整数非常高。如果你使用的是32位系统,你可能希望'substr()'离开'uniqid()'的前2个字节。 –

2

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

另一种解决方案是使用microtime()返回以微秒为当前时间,这将给你独一无二的邮票,因为这将是不平凡的在同一微秒发生的事件。你也可以很可能使用microtime()内部使用的时间(考虑uniqid()从以微秒当前时间(生成一个ID

1

)通常不是唯一的ID是个好主意,有几个原因:

  1. 不同的操作系统可以有不同的时间分辨率,所以你可能会得到连续的ID 2完全相同
  2. 它可能没有关系,但它是相当容易的猜测,是基于时间
+0

即使所有'随机'数字都是基于当前时间。这就是为什么随机性不存在,所有的随机性实际上是伪随机性。但是非常真实! +1 – Rudie

+0

并非所有的随机发生器都是基于时间的(尽管大多数都是),有些是基于温度的,在极少数情况下是量子隧道效应。但更重要的是,它们在数学上更难以相互推断,这是实际的一点。 – idanzalz

+0

温度=)Kewl!不知道。 – Rudie

2

mt_标识rand可以生成两次相同的值,但您可以考虑这种情况的概率,其中时间返回自unix时期以来的秒数,不能重复两次。但它每秒都会改变,这意味着如果一秒钟内调用超过一次,它将返回相同的结果,其中mt_rand可能会返回不同的值。