2

我正在考虑使用这个: 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) 吗?

4

6 回答 6

6

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

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

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

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

于 2009-09-08T09:54:03.220 回答
4

为什么需要唯一 ID?

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

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

编辑,相对于 OP 的评论:

如果是,您就不能拥有“始终独一无二”。或者,如果你找到了方法,你将赢得图灵奖。

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

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

于 2009-09-08T09:30:01.303 回答
3

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

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

于 2009-09-08T10:04:44.573 回答
1

取自 PHP 的uniqid的手册页:

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

尽管最好将md5-part 排除在外(将令牌数量减少到 2^128)

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

于 2009-09-08T09:36:07.487 回答
1

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

 $generate_order_id  = hash('sha256', microtime() );
于 2015-04-15T19:37:21.667 回答
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 将创建一个新的。

注意:通过使用这种方法,您必须对 db 进行额外的查询并在循环中使用函数,所以它不是最快的方法......

于 2019-10-19T18:48:05.163 回答