0

我不希望我的数据库 id 是连续的,所以我尝试使用以下代码生成 uid:

$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);

我的问题是:我需要多少字节才能使 id 足够独特以处理大量记录(如 twitter)?

4

4 回答 4

3

使用 PHP 的uniqid(),增加熵因子。这会给你足够的空间。

于 2012-09-18T15:05:02.987 回答
2

您可能会考虑 tinyurl 和其他缩短服务的工作方式。我使用了类似的技术,它保证了唯一性,直到用尽所有组合。所以基本上你选择一个字母,以及你想要多少个字符作为长度。假设我们使用字母数字,大写和小写,所以字母表中有 62 个字符,每个代码 5 个字符。那是 62^5 = 916,132,832 种组合。

您从顺序数据库 ID 开始,然后乘以某个素数(选择一个相当大的数字,例如 2097593)。您所做的就是将其乘以您的数据库 ID,如果超过 62^5,请确保环绕,然后根据您选择的字母将该数字转换为 base-62。

这使得每个代码看起来都相当独特,但是因为我们使用质数,所以在我们已经使用所有代码之前,我们保证不会两次点击相同的数字。而且很短。

如果长度不是问题,您也可以使用带有较小字母的较长键。

这是我问的一个问题:Tinyurl-style unique code: potential algorithm to prevent collisions

于 2012-09-18T15:15:12.267 回答
0

使用 MySQL UUID

insert into `database`(`unique`,`data`) values(UUID(),'Test');

如果您不使用 MySQL 搜索 google 的 UUID(数据库名称),它会给您一个选项

来源维基百科

换句话说,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%

于 2012-09-18T15:16:42.890 回答
0

假设openssl_random_pseudo_bytes可能会生成每个可能的值,N 个字节将为您提供2 ^ (N * 8)不同的值。对于 12 个字节,这是7.923 * 10^28

于 2012-09-18T15:24:38.587 回答