我不希望我的数据库的ID是连续的,所以我想生成与此代码的UID:
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
我的问题是:有多少字节,我会需要作出独特的,足以应付大量的记录(如Twitter)的ID?
我不希望我的数据库的ID是连续的,所以我想生成与此代码的UID:
$bin = openssl_random_pseudo_bytes(12);
$hex = bin2hex($bin);
return base_convert($hex, 16, 36);
我的问题是:有多少字节,我会需要作出独特的,足以应付大量的记录(如Twitter)的ID?
你可能会考虑类似的方式TinyURL的和其他缩短服务工作。 我已经使用了类似的技术,直到所有组合被耗尽从而保证唯一性。 所以基本上你选择一个字母,你有多少个字符要作为一个长度。 比方说,我们用字母数字,上下,所以这是字母表中的62个字符,并让我们做每码5个字符。 这是62 ^ 5 = 916132832组合。
你开始你的顺序数据库ID和你乘上出现一些质数(任选其一这是相当大的,像2097593)。 你要做的就是乘上你的数据库ID,确保环绕,如果你超过62 ^ 5,然后转换这个数字与base-62按您选择的字母。
这使得每个代码看起来相当独特的,但因为我们使用一个素数,我们保证不会两次击中同一个号码,直到我们使用的所有代码了。 而且它是非常短的。
您可以使用更长的密钥具有更小的字母也一样,如果长度是不是一个问题。
这里有一个问题,我沿着相同的路线问: TinyURL的风格的唯一代码:潜在的算法,以防止碰撞
使用PHP的uniqid()
与添加的熵因素。 这会给你足够的空间。
假设openssl_random_pseudo_bytes
可以生成每一个可能的值,N个字节会给你2 ^ (N * 8)
不同的值。 为12个字节,这是7.923 * 10^28
使用MySQL UUID
insert into `database`(`unique`,`data`) values(UUID(),'Test');
如果你不使用UUID(数据库名称)的MySQL搜索谷歌,它会给你一个选择
来源维基百科
换句话说,只有一点产生十亿的UUID每秒未来100年后,创建只有一个重复的概率会约50%