从关于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/urandomqrand(),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/

10-12 02:02