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

在PHP中生成真正唯一的订单id?,php,unique-key,Php,Unique Key,我正在考虑使用这个: 我的想法是使用2和3的混合物。但我的问题是,尽管可能性很小,但如果我将结果子串为仅5个字符长,是否仍有可能生成两个具有相同顺序的顺序?3号怎么样?2.1.当然,如果是1,则id相同的可能性为1/(26+10)为什么需要唯一的id 如果您想在数据库中生成一个唯一的ID,则使用自动增量将其留给数据库 无论如何,您可以使用microtime()和rand()的组合。你很独特 编辑,相对于OP的评论: 你不能有一个“总是独一无二的”如果。或者如果你找到了方法,你会赢得图灵奖 即使是

我正在考虑使用这个:


我的想法是使用2和3的混合物。但我的问题是,尽管可能性很小,但如果我将结果子串为仅5个字符长,是否仍有可能生成两个具有相同顺序的顺序?3号怎么样?2.1.当然,如果是1,则id相同的可能性为1/(26+10)

为什么需要唯一的id

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

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

编辑,相对于OP的评论:

你不能有一个“总是独一无二的”如果。或者如果你找到了方法,你会赢得图灵奖

即使是更好的数学方法,也会让你尝到“是的,但每1564573536475次,我就会被搞砸”

唯一的方法是有一个计数器,每当你们需要一个新的ID时,你们就增加它。DBs就是这样做的。为什么在插入之前需要Id?

摘自PHP的主页:

$better_token = md5(uniqid(mt_rand(), true));
尽管最好不要使用
md5
-part(将令牌数量减少到2^128)


如果您使用的是数据库,那么是的,您应该让您的DBMS处理id的生成,假设您的用户经过身份验证并且具有用户id:

$unique_id = time() . mt_rand() . $userid;
如果同一用户在同一秒内第二次请求此页面,则在
mt_getrandmax()
中仍有可能出现1,这在我的计算机上返回2147483647。你能接受吗


如果您的用户没有经过身份验证,如果您愿意,您可以使用他们IP地址的散列。

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


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

您可以使用微时间和sha256哈希,也可以不使用哈希。

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

如果您使用的是数据库,您应该让您的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]) );

$uids\u in\u db=[]//在提交到db之前,我需要一个唯一的id。我同意,这将是“非常独特的”。我怎样才能得到一个总是唯一的,而不存储在数据库中的。你认为这是怎么可能的?要生成“始终唯一的id”,您不仅需要知道以前生成的所有id,还需要知道将要生成的任何id。。。弄清楚怎么做会很有趣…@x3ro:这有点夸张……如果你假设算法本身没有改变,那么你可以通过知道所有过去的ID或所有未来的ID来保证一个唯一的ID。利用我们目前的技术,前者更容易实现!发布链接的第一个代码示例已经很糟糕了:他忘了在字符串周围加引号(我认为这不是常数),我同意数学方法。IMO 1E-15开始被接受。