来自QUuid上的Qt5参考:

QUuid QUuid::createUuid()[静态]

在Windows以外的任何平台上,此函数返回一个新的UUID 具有变体QUuid::DCE和版本QUuid::Random。如果/dev/urandom 设备存在,那么用于构造UUID的数字将是 密码质量,这将使UUID唯一。否则, UUID的数字将从本地伪随机获得 数字生成器(qrand(),由qsrand()播种) 通常不具有cryptograhic质量,这意味着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列是预期的)。

谢谢!

有帮助吗?

解决方案

enter image description here

你在第4行的输出几乎肯定只是随机的机会。6Uuid不是一个足够大的样本来提供任何随机性的指示,如果你真的想确定你需要测试大量的Uuid(比现实可行的更多)。

关于第3列和第4列,正如您已经注意到的那样,第3列中的前导"4"是预期的,因为它表示UUID版本。第4列中的前导值(b 55d, 8 285, 9 303, ...)虽然也是预期的,这个值 将始终为8,9,a或b.在这些值之外,我在第3列和第4列中没有看到任何特定的对称性。

检查是否 /dev/urandomqrand() 在使用时,QUuid类不会提供这些信息,但是如果您真的想知道,您可以随时执行QUuid类的操作,并尝试从 /dev/urandom.我认为这可能是矫枉过正。虽然我当然不会依赖 qrand() 在安全需要质量随机数的任何情况下,它的实现(考虑到它是如何播种的,~第959行)可能足以生成Uuid。

其他提示

一般来说,你可以用这种方式在控制台上尝试

random="$(dd if=/dev/urandom bs=10 count=1)";
echo $random

如果这给你10个字符, urandom 正在工作。如果您的设置一切正常,Qt也会使用它。

据我所知,这也只是一个psedo随机数生成器,与系统生成的熵一起工作。而 /dev/random 使用熵太低时的块, urandom 继续给你数字。

所以如果你需要依靠绝对的安全,买一个真正的 RNG.如果你对 /dev/random, ,使用它。如果你没有创造那么多(数百万可能更多) uuids 而不是在系统启动时运行, urandom 很好,但要小心使用。

哦,为什么 /dev/random/dev/urandom 不是真的 RNG ?

仅仅是因为你可以通过再现情况来再现它的输出。如果没有精确地观察一个系统,而它的熵被用于这样的乐趣,这是不可能的。..但理论上它是可能的。对于真正的随机性,您可能希望有一个观察量子态的设备。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top