从关于QUuid的Qt5参考中:
QUuid QUuid :: createUuid()[静态]
在Windows以外的任何平台上,此函数都返回新的UUID
带有变体QUuid :: DCE和版本QUuid :: Random。如果/ dev / urandom
设备存在,则用于构造UUID的数字将为
加密质量,这将使UUID唯一。否则,
UUID的编号将从本地伪随机数获得
数字生成器(qrand(),由qsrand()播种)是
通常不具有加密质量,这意味着不能保证UUID是唯一的。
当在具有/ dev / urandom的平台上时,如何确定/ dev / urandom实际上是否可用并且在运行时会被该函数使用?
我怀疑这不是我的情况,基于我出于好奇心而运行的这段小代码:
while(true){
QUuid u=QUuid::createUuid();
QString str=u.toString();
if(str.contains("2222")){
qDebug()<<"UUID:"<<str;
return;
}
}
当我反复运行它时,将产生以下输出:
1 UUID: "{8b42222b-bac3-4c93-b55d-0255a33115a2}"
2 UUID: "{5122227e-473e-4885-8285-8780cc51f71a}"
3 UUID: "{bfeed28f-f8da-4a69-9303-77388752222e}"
4 UUID: "{0000beee-690c-4875-9589-9e222222cedc}"
5 UUID: "{e5a2646d-1c81-4974-94ad-8b222265b67a}"
6 UUID: "{bb77d756-6726-4e9f-94d8-3d4892222a2f}"
注意第4行的输出看起来很奇怪,在第3列和第4列中还有其他明显的对称性(除了第3列开头的4以外)。
谢谢!
最佳答案
您在第4行上的输出几乎可以肯定只是随机机会。 6 UUID不够大,无法提供任何随机性指示,如果您确实想确定,则需要测试大量的UUID(实际上不可行)。
关于第3列和第4列,正如您已经注意到的那样,第3列中的前导“ 4”是预期的,因为它表示UUID版本。尽管也期望第4列中的前导值(b 55d,8 285、9303等),该值will always be 8, 9, a, or b。在这些值之外,在第三和第四列中没有看到任何特定的对称性。
为了检查是否使用了/dev/urandom
或qrand()
,QUuid类不会使此信息可用,但是如果您真的想知道您可以始终执行QUuid类的操作并尝试打开和读取/dev/urandom
中的数据。我认为这可能太过分了。虽然在任何需要质量随机数以确保安全的情况下,我当然都不会依赖qrand()
,但是它的实现(given how it's being seeded, ~line 959)可能足以生成UUID。
关于cryptography - 如何确定QUuid::createUuid()生成的UUID是否基于加密质量的熵?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25038169/