计算 UUID 是唯一的概率
Calculating the probability of the UUID to be Unique
我没有使用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))
相关文章:
- 何时在引用或唯一指针上使用移动语义
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 计算排序向量的向量中唯一值的计数
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- 如何根据单词在文本中出现的概率输出单词
- 通过组合不同的类型来创建唯一的id
- 使用Unique_ptr确保工厂中的对象唯一
- c++多进程编写一个唯一的文件
- 在以唯一ptr为值的C++映射中,动态内存何时会被销毁
- 如何更改唯一指针向量的可见性
- 在C++的两个字符串中连接以逗号分隔的唯一值
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- C++尝试深度复制唯一指针时出现内存访问冲突
- 具有引用成员的结构是否具有唯一的对象表示形式
- 使用 RTTI 克隆唯一指针的向量
- 如何在 c++ 中迭代数组中的唯一元素
- 为什么我无法创建唯一指针
- 堆分配的对象是否存在永不为空的唯一所有者?
- 容器,其中每个项可以有多个非唯一键 (c++17)
- 计算 UUID 是唯一的概率