多少字节Twitter并不够独特?(How many bytes are unique enough

2019-10-17 05:23发布

我不希望我的数据库的ID是连续的,所以我想生成与此代码的UID:

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

我的问题是:有多少字节,我会需要作出独特的,足以应付大量的记录(如Twitter)的ID?

Answer 1:

你可能会考虑类似的方式TinyURL的和其他缩短服务工作。 我已经使用了类似的技术,直到所有组合被耗尽从而保证唯一性。 所以基本上你选择一个字母,你有多少个字符要作为一个长度。 比方说,我们用字母数字,上下,所以这是字母表中的62个字符,并让我们做每码5个字符。 这是62 ^ 5 = 916132832组合。

你开始你的顺序数据库ID和你乘上出现一些质数(任选其一这是相当大的,像2097593)。 你要做的就是乘上你的数据库ID,确保环绕,如果你超过62 ^ 5,然后转换这个数字与base-62按您选择的字母。

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

您可以使用更长的密钥具有更小的字母也一样,如果长度是不是一个问题。

这里有一个问题,我沿着相同的路线问: TinyURL的风格的唯一代码:潜在的算法,以防止碰撞



Answer 2:

使用PHP的uniqid()与添加的熵因素。 这会给你足够的空间。



Answer 3:

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



Answer 4:

使用MySQL UUID

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

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

来源维基百科

换句话说,只有一点产生十亿的UUID每秒未来100年后,创建只有一个重复的概率会约50%



文章来源: How many bytes are unique enough for twitter?