计算UUID为唯一的概率

时间:2017-03-29 09:07:02

标签: c++ algorithm probability uuid

我没有使用Boost的可能性,因此我编写了一个相当简单的代码来生成UUID。但是,我不知道如何计算此代码生成的UUID的唯一性!有人可以解释如何计算由以下代码生成的UUID的概率是唯一的吗?

string UUID;
uint8_t uuidLength = 32;
uint8_t asciiSets[][2]={
     {48, 10},     //Numbers 0-1
     {65, 26},     //Alphabet a-z
     {97, 26}      //Alphabet A-Z
};
UUID.reserve(uuidLength);

uint8_t counter;
srand(time(NULL));

for(counter = 0;counter<uuidLength;counter++)
{
    uint8_t set = rand()%3;//Choose one of the three sets of ascii ranges
    uint8_t start = asciiSets[set][0];
    uint8_t range = asciiSets[set][1];
    UUID[counter] = rand()%range+start;
}

3 个答案:

答案 0 :(得分:2)

与每个字符相关的概率对于数字为1/30,对于字母为1 /(3 * 26)。这使得熵为4.038位,而如果分布是均匀的则为4.13。这相当于H = 32 * 4.038 = 129.22位熵总数。这大致相当于对具有2 ^ 129.22种可能性的均匀分布进行采样

如果你寻找碰撞的概率,它将取决于你明显生成的uuid的数量。您应该按照建议查看https://en.wikipedia.org/wiki/Birthday_attack。正如您将看到的那样,给出了与n个样本发生碰撞的概率,您可以将此公式应用于上面给出的H的2 ^ H.

计算熵的代码:

EMPTY

答案 1 :(得分:2)

首先要注意的是,非常不太可能生成UUID。 UUID包含32个十六进制数字,您生成的62个字符中只有22个是十六进制数字。这大约是每个数字中的1/3,因此实际产生32位十六进制数的概率为250万亿分之一。

只需使用Boost。

答案 2 :(得分:-1)

让我为您搜索维基百科: https://en.wikipedia.org/wiki/Birthday_problem