【发布时间】:2018-08-16 14:49:47
【问题描述】:
我对一个项目有要求
- 我需要生成唯一 ID。
- ID 必须大写。
- 我无法检查数据库以查看之前是否使用过 ID。
我们预计每个月都会有数百万条记录添加到数据库中。
我在这里尝试过解决方案:PHP: How to generate a random, unique, alphanumeric string? 虽然它们一开始似乎有效,但我的测试表明随着时间的推移会有重复。
现在我正在考虑使用带前缀的 uniqid。我发现使用不带前缀的 uniqid 的问题是,当同时请求同时进入服务器时会产生重复。我希望使用前缀可以解决这个问题。
我正在考虑使用这个功能:
private function generate_id()
{
$alpha_numeric = 'ABCDEFGHIJKLMNPQRSTUVWXYZ0123456789';
$max = strlen($alpha_numeric);
$prefix = '';
for ($i = 0; $i < 5; $i++)
{
$prefix .= $alpha_numeric[random_int(0, $max - 1)];
}
return strtoupper(uniqid($prefix));
}
前缀是 5 个字符的字母数字字符串。这足以满足我的要求吗?
*****编辑*****
按照建议使用 UUID 是限制冲突机会的最佳方法,但已决定采用上述方法,但将前缀增加到 7 个字符。如果在同一毫秒内生成两个 ID,则发生冲突的可能性约为 830 万分之一。上级认为这是可以接受的。
【问题讨论】:
-
也许你可以使用类似这样的库:github.com/ramsey/uuid 来呈现 UUID?
-
也许,您可以使用数组或类似的东西来识别已使用的 id。
-
@Comp 那么 OP 将如何 a)在内存中保留一个 100,000,000 条目数组,然后 b)在不查询数据库的情况下加载它
-
如果您使用 MSSQL 服务器作为数据库引擎,您可以使用
GUID(全局唯一标识符)方法使用NEWID()函数。请在此处阅读更多信息:docs.microsoft.com/en-us/sql/t-sql/functions/… -
@RiggsFolly 没有查询会去,但是是的,数组太大了,我没想到。
标签: php string random uniqueidentifier unique-key