2012-09-18 31 views
0

我不希望我的数据库的ID是连续的,所以我想生成与此代码的UID:有多少个字节对于twitter来说足够独特?

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

我的问题是:有多少字节,我会需要做的ID唯一不够处理大量的记录(如Twitter)?

+0

为什么你不希望你的数据库ID是连续的?如果这只是为了显示,我建议你找到一种方法来显示它们,但在数据库中留下连续的ID。 – Brad

+0

@Brad更安全,让我隐藏我的应用程序的增长。 –

+0

请定义巨额。你除了什么增长? –

回答

2

您可能会考虑类似tinyurl和其他缩短服务的工作方式。我已经使用了类似的技术,它保证了唯一性,直到所有的组合都用完为止。所以基本上你选择一个字母表,以及你想要多少个字符作为长度。假设我们使用字母数字,高位和低位,所以这是字母表中的62个字符,并且让我们每个代码执行5个字符。这是62^5 = 916,132,832的组合。

你开始你的顺序数据库ID和你乘上出现一些质数(任选其一这是相当大的,像2097593)。你所要做的就是将你的数据库ID乘以数字,如果超过62^5,请确保回卷,然后按照您选择的字母表将该数字转换为基数62。

这使得每个代码看起来相当独特的,但因为我们使用一个素数,我们保证不会两次击中同一个号码,直到我们使用的所有代码了。而且非常短。

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

这里有一个问题,我沿着相同的路线问:Tinyurl-style unique code: potential algorithm to prevent collisions

3

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

+0

uniqid基本上是基于microtime,所以它不是不可预测的... –

+1

@hugo_leonardo:是吗,你能预测它现在会是什么样子吗?你怎么可能知道在生成ID时确切的microtime是什么。请告诉我,99.9%的原因足够随机,而你的看起来并不像0.01%。 –

+0

知道一个ID,那么用一点蛮力猜测下一个(或前一个)会很容易。但是,无论如何......根据@Jan的身份证应该只有数字,所以uniqid不会这样做。 –

0

使用MySQL的UUID

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

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

源维基百科

换句话说,生成1份十亿后仅UUID的每一秒钟在未来100年里,创建只有一个重复的概率会约50%

0

假设openssl_random_pseudo_bytes可以产生每一个可能的值,N个字节会给你2^(N * 8)不同的值。对于12个字节,这是7.923 * 10^28

相关问题