C++ qt rcc(资源编译器)是非确定性的-如何使其具有确定性

C++ qt rcc(资源编译器)是非确定性的-如何使其具有确定性,c++,windows,qt,C++,Windows,Qt,我的makefile中有一个命令,它使用 此实用程序为传递给它的每个图像文件生成一个静态数组。 不幸的是,rcc.exe是不确定的:生成的.cpp文件中这些数组的顺序对于每次调用都是不同的。 我运行了三次: >C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-1.cpp >C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_

我的makefile中有一个命令,它使用
此实用程序为传递给它的每个图像文件生成一个静态数组。
不幸的是,
rcc.exe
是不确定的:生成的
.cpp
文件中这些数组的顺序对于每次调用都是不同的。

我运行了三次:

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-1.cpp

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-2.cpp

>C:\rcc.exe -name lookupmodels lookupmodels.qrc -o .qrc/qrc_lookupmodels-3.cpp
.qrc
文件是:

<RCC>
    <qresource prefix="/">
        <file>datapool_pdal1.csv</file>
        <file>events_Ic.csv</file>
        <file>events_Evt.csv</file>
        <file>events_Other.csv</file>
        <file>key_events.csv</file>
        <file>loglevel_DPvalues.csv</file>
        <file>loglevel_Evtvalues.csv</file>
        <file>log_freqDP.csv</file>
    </qresource>
</RCC>

数据池\u pdal1.csv
事件_Ic.csv
事件\u Evt.csv
events_Other.csv
key_events.csv
logleveldpuvalues.csv
loglevel_Evtvalues.csv
log_freqDP.csv
作为
static const unsigned char
的数组,
.cpp
文件非常大,因此我不会在这里显示它们,但基本问题是,这些数组(表示图像)的顺序会随着调用的不同而变化

问题

要比较构建与构建—特别是在切换构建系统的情况下—我需要能够比较工件。

我希望它们不要改变,这样我就可以比较不同构建的工件输出,看看是否有什么改变了


这是唯一一个给我这个问题的对象文件。

很可能是偶然的;在内部,rcc在某个地方使用一个
QHash
,它在其哈希函数中使用一个随机种子:

这是由于散列随机性。这样做是为了避免DoS攻击 可以通过调整数据来执行,以确保数据始终处于相同的位置 散列桶

要使哈希种子非随机(从而使rcc具有确定性),请在调用rcc之前将环境变量
QT\u hash\u seed
设置为某个固定的数值

默认情况下,QHash的这种随机化是启用的。即使程序永远不应该依赖于特定的QHash顺序,也可能存在暂时需要确定性行为的情况,例如调试或回归测试。要禁用随机化,请定义环境变量QT_HASH_SEED。该变量的内容(解释为十进制值)将用作qHash()的种子。或者,您可以调用qSetGlobalQHashSeed()函数



无论如何,关于这个问题的补丁(更一般地说,它应该修复uic和moc中的类似问题),所以Qt的最新版本不应该受到影响

显然,你不应该依赖于资源的顺序。资源是通过名称/路径(如.qrc中所定义)访问的,而不是通过它们在.cpp文件中的顺序。@VioletGiraffe资源数组的顺序会影响目标文件,而目标文件会影响我的最终可执行文件。我还应该如何比较构建之间的可执行文件呢?我明白了,我错过了问题的最后一点。但无论如何,你不能期望你的二进制文件能一点一点地匹配。至少我从来没有这样做过,它们有像随机ID和日期/时间之类的东西。@VioletGiraffe有一种“校验和”类型的东西不依赖于编译数组的顺序吗?@VioletGiraffe我将加粗。我的坏消息太棒了,但我真的很想知道:你是如何找到这些信息的?谷歌搜索“QT随机化”?邮件列表链接是谷歌第三次点击“QT rcc可复制构建”;在那里我发现了“QT_HASH_SEED”,然后我立即在
QHash
的文档中搜索并找到了它。很高兴这有帮助