我正在考虑使用这个: 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) 吗?
我正在考虑使用这个: 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) 吗?
假设您的用户已通过身份验证并具有用户 ID:
$unique_id = time() . mt_rand() . $userid;
如果同一用户在同一秒内第二次请求此页面,仍然有机会 1 in mt_getrandmax()
,在我的机器上返回 2147483647。您可能会接受吗?
如果您的用户未经过身份验证,您可以根据需要使用其 IP 地址的哈希值。
为什么需要唯一 ID?
如果您想在您的数据库中生成一个唯一 ID,则使用自动增量将其留给您的数据库。
无论如何,您可以使用 microtime() 和 rand() 的组合。你很独特。
编辑,相对于 OP 的评论:
如果是,您就不能拥有“始终独一无二”。或者,如果你找到了方法,你将赢得图灵奖。
更好的数学方法会让你尝到“是的,但是在 15645736536475 次中,我会被搞砸的”。
唯一的方法是拥有计数器,每次需要新 ID 时都会增加。数据库就是这样做的。为什么在插入之前需要 Id ?
如果您依赖随机字符串,那么是的,理论上两个 ID 可能相同。这就是使用长随机字符串的原因,以使这种可能性不太可能被接受。可以计算概率:例如,如果一个 ID 由当前时间(精确到秒)和一个随机的 5 个字符的字母数字字符串组成,并且假设在同一秒内生成了 3 个 ID,则两个 (或更多)相同的是:1 - (38^5! / (38^5-3)! / 38^5^3) = 3.79e-8。大多数人会同意这样的几率对于实际应用来说还不够低,这就是为什么您链接到的页面建议使用 10 个字符。
如果您有会话 ID、用户名等,那么您可以在订单 ID 中使用它来帮助解决问题。
取自 PHP 的uniqid的手册页:
$better_token = md5(uniqid(mt_rand(), true));
尽管最好将md5
-part 排除在外(将令牌数量减少到 2^128)
如果您使用数据库,那么是的,您应该让您的 DBMS 处理 id 的生成
您可以使用 microtime 和 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]) );
这样你就不会有重复的 uid,如果是这样,那么 do while 将创建一个新的。
注意:通过使用这种方法,您必须对 db 进行额外的查询并在循环中使用函数,所以它不是最快的方法......