计算 UUID 是唯一的概率

Calculating the probability of the UUID to be Unique

本文关键字:概率 唯一 UUID 计算      更新时间:2023-10-16

我没有使用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;
}

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

只需使用增强。

与每个字符关联的概率对于数字为 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。

计算熵的代码:

import numpy as np
probs = [1/30.]*10 + [1/(3*26.)]*52
ent = -np.sum(probs*np.log(probs))