在PHP中生成一个真正独特的订单ID?

时间:2009-09-08 09:16:44

标签: php unique-key

我正在考虑使用它:http://phpgoogle.blogspot.com/2007/08/four-ways-to-generate-unique-id-by-php.html

我的想法是使用介于2和3之间的混合物。但我的问题是,虽然机会很小,但是如果我将结果子串的话,仍然有可能生成具有相同顺序#的两个订单只有5个字符? 3怎么样? 2? 1?当然如果它是1,那么id有相同的1 /(26 + 10)几率?

6 个答案:

答案 0 :(得分:5)

假设您的用户已通过身份验证且具有用户ID:

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

如果同一个用户在同一秒内第二次请求此页面,mt_getrandmax()中仍然有可能为1,这在我的机器上会返回2147483647.您可以接受这个吗?

如果您的用户未经过身份验证,则可以根据需要使用其IP地址的哈希值。

答案 1 :(得分:4)

为什么需要唯一的ID?

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

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

编辑,相对于OP的评论:

如果你不能拥有“永远独一无二”。或者,如果你发现如何,你将获得图灵奖。

更好的数学方法让你有一种“是的,但在15645736536475次,我会被搞砸”。

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

取自PHP的uniqid手册页:

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

虽然最好让md5 - 部分离开(将令牌数量减少到2 ^ 128)

如果你使用数据库,那么是的,你应该让你的DBMS处理id的生成

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

如果您使用的是数据库,则应让您的DBMS处理ID的生成。

如果您想自己做,有办法...不是最好的办法,但是可以完成工作。

首先从db获取所有存在的uid,然后执行do while循环...

$uids_in_db = []; //<< get here the uids from id. Use array_flip so the uids to be the keys in the array ( because isset is faster than in_array )

do{

    $uid = generate_somehow_a_random_uid();

} while ( isset( $uids_in_db[$uid]) );

那样,您想要的将不会有重复的uid,如果是这样,那么do while将创建一个新的uid。

  

注意:通过使用此方法,您必须对数据库进行额外的查询并使用   在循环内起作用,所以它不是最快的方法...