我不希望我的数据库ID是顺序的,所以我试图用这段代码生成uid:
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
我的问题是:我需要多少字节才能使id足够独特以处理大量记录(如twitter)?
答案 0 :(得分:3)
使用PHP的 uniqid()
,增加了熵因子。那会给你足够的空间。
答案 1 :(得分: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
答案 2 :(得分:0)
使用MySQL UUID
insert into `database`(`unique`,`data`) values(UUID(),'Test');
如果你没有使用MySQL搜索谷歌搜索UUID(数据库名称),它会给你一个选项
来源维基百科
换句话说,只有在接下来的100年中每秒产生10亿UUID之后,创建一个副本的概率大约为50%
答案 3 :(得分:0)
假设openssl_random_pseudo_bytes
可能生成每个可能的值,N个字节将为您提供2 ^ (N * 8)
个不同的值。对于12个字节,这是7.923 * 10^28