2009-09-08 20 views
2

我使用的是考虑这个:http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html在PHP中生成真正独特的订单ID?

我的想法是使用2和3之间的混合,但我的问题是,虽然可能性很小,是还有一个机会,两个命令具有相同的顺序如果我将结果子字符串长度仅为5个字符,可以生成#个字符吗? 3呢? 2? 1?当然,如果它是1,那么id有可能是1 /(26 + 10)。

+0

在发布链接的第一个代码示例已经是废话:他忘了在他的字符串认沽报价(我不认为这是一个常数) – knittl 2009-09-08 09:33:40

回答

4

假设你的用户的产生,有一个用户ID:

$unique_id = time() . mt_rand() . $userid; 

如果同一用户在同一秒内第二次请求此页面,则mt_getrandmax()中的机会仍然为1,并且在我的机器上返回2147483647.您也许可以忍受这种情况?

如果您的用户未通过身份验证,您可以根据自己的IP地址使用散列。

4

为什么你需要一个唯一的ID?

如果您想在您的数据库中生成一个唯一的ID,请使用自动增量将其保留到您的数据库中。

无论如何,你可以使用microtime()和rand()的组合。你很独特。

编辑,相对于OP的评论:

你不能有一个 “始终是唯一的” 如果。或者如果你发现如何,你会赢得图灵奖。

更好的数学方法让你尝到了“是的,但一旦在15645736536475次,我会搞砸”。

唯一的办法是有计数器,每增加一次你就需要一个新的ID。这就是数据库的作用。为什么在插入前需要ID?

+0

我想唯一的ID在我提交到数据库。我同意,这将是“非常独特”。我怎样才能获得一个独一无二的,而不需要将其存储在数据库中的。 – coderama 2009-09-08 09:33:26

+0

你认为这有可能吗?要生成“始终唯一的ID”,您不仅必须知道之前生成的所有ID,还需要生成任何ID。请花点时间了解如何做到这一点...... – fresskoma 2009-09-08 10:04:37

+2

@ x3ro :这有些夸张......如果您认为算法本身没有改变,那么您可以通过了解*所有过去的ID *或*所有将来的ID来保证唯一的ID。而用我们目前的技术,前者更容易实施! – 2009-09-08 10:09:19

1

从PHP的uniqid的手册页采取:

$better_token = md5(uniqid(mt_rand(), true)); 

虽然它可能会更好离开md5 -part出来,如果你的使用(减少令牌2^128号)

数据库,那么,你应该让你的DBMS处理被认证的ID的

3

如果你依赖于一个随机字符串,那么是的,理论上两个ID可能是相同的。这就是为什么使用一个很长的随机字符串,使这种可能性不可能被接受。可以计算概率:例如,如果一个ID由当前时间(到最近的秒)和一个随机的5个字符的字母数字字符串组成,并且假设3个ID在同一秒内生成,则两个(38^5!/(38^5-3)!/ 38^5^3)= 3.79e-8。大多数人会同意这样的几率是而不是足够低的实际应用程序,这就是为什么您链接到的页面建议10个字符,而不是。

如果您有会话ID,用户名等,那么您可以在订单ID中使用该ID来帮助解决问题。

+0

我同意数学方法。 IMO 1E-15 **开始**是可以接受的。 – 2009-09-08 10:50:35

1

您可以使用microtime和sha256散列,或不使用散列。

$generate_order_id = hash('sha256', microtime());