在PHP中生成真正唯一的订单ID?

问题描述 投票:2回答:6

我正在考虑使用此: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)?]

php unique-key
6个回答
5
投票

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

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

如果同一用户在同一秒内第二次请求此页面,则mt_getrandmax()仍有机会1,这在我的计算机上将返回2147483647。您可能可以忍受吗?

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


4
投票

为什么需要唯一的ID?

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

无论如何,您可以结合使用microtime()和rand()。您非常独特。

编辑,相对于OP的注释:

如果您不能拥有“总是唯一的”。或者,如果您找到方法,则将获得图灵奖。

甚至更好的数学方法也会使您感到“是的,但是一旦达到15645736536475次,我就会被搞砸了”。

[唯一的方法是拥有计数器,每次需要新的ID时就增加。数据库就是这样做的。为什么在插入之前需要ID?


3
投票

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

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


1
投票

摘自PHP的uniqid手册页:

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

尽管最好保留md5部分(将令牌数减少到2 ^ 128)

[如果您使用的是数据库,则可以,请让您的DBMS处理ID的生成


1
投票

您可以使用microtime和sha256哈希,或者不使用哈希。

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

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。

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

© www.soinside.com 2019 - 2024. All rights reserved.