我不希望我的数据库 id 是连续的,所以我尝试使用以下代码生成 uid:
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
我的问题是:我需要多少字节才能使 id 足够独特以处理大量记录(如 twitter)?
我不希望我的数据库 id 是连续的,所以我尝试使用以下代码生成 uid:
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
我的问题是:我需要多少字节才能使 id 足够独特以处理大量记录(如 twitter)?
使用 PHP 的uniqid()
,增加熵因子。这会给你足够的空间。
您可能会考虑 tinyurl 和其他缩短服务的工作方式。我使用了类似的技术,它保证了唯一性,直到用尽所有组合。所以基本上你选择一个字母,以及你想要多少个字符作为长度。假设我们使用字母数字,大写和小写,所以字母表中有 62 个字符,每个代码 5 个字符。那是 62^5 = 916,132,832 种组合。
您从顺序数据库 ID 开始,然后乘以某个素数(选择一个相当大的数字,例如 2097593)。您所做的就是将其乘以您的数据库 ID,如果超过 62^5,请确保环绕,然后根据您选择的字母将该数字转换为 base-62。
这使得每个代码看起来都相当独特,但是因为我们使用质数,所以在我们已经使用所有代码之前,我们保证不会两次点击相同的数字。而且很短。
如果长度不是问题,您也可以使用带有较小字母的较长键。
这是我问的一个问题:Tinyurl-style unique code: potential algorithm to prevent collisions
使用 MySQL UUID
insert into `database`(`unique`,`data`) values(UUID(),'Test');
如果您不使用 MySQL 搜索 google 的 UUID(数据库名称),它会给您一个选项
来源维基百科
换句话说,仅在接下来的 100 年每秒生成 10 亿个 UUID 之后,仅创建一个副本的概率约为 50%
假设openssl_random_pseudo_bytes
可能会生成每个可能的值,N 个字节将为您提供2 ^ (N * 8)
不同的值。对于 12 个字节,这是7.923 * 10^28