qt rcc(资源编译器)是非确定性的 - 如何使其成为确定性的

时间:2016-08-12 21:00:36

标签: c++ windows qt

我的makefile中有一个使用Qt resource compiler的命令。
该实用程序为传递给它的每个图像文件生成一个静态数组 不幸的是,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>

作为static const unsigned char的数组,.cpp文件是巨大的,所以我不会在这里显示它们,但基本问题是这些数组的顺序,代表图像,从一个变化调用下一个。

问题

比较构建版本 - 特别是因为我正在切换构建系统 - 我需要能够比较工件。

我希望它们不会改变,以便我可以将构建中的工件输出与构建进行比较,以查看是否有更改。

这是唯一一个给我这个问题的目标文件。

1 个答案:

答案 0 :(得分:3)

最有可能是偶然的;在内部,rcc在某处使用QHash,在其散列函数中使用随机种子:

http://interest.qt-project.narkive.com/HsoMhGOu/qt-resource-compiler-why-does-it-randomize-the-order-of-items

  

这是由于散列随机化。这样做是为了避免DoS攻击   可以通过调整数据来确保它始终属于同一个数据   哈希桶。

要使散列种子非随机(从而使rcc确定性),请在调用rcc之前将环境变量QT_HASH_SEED设置为某个固定的数值。

  

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

http://doc.qt.io/qt-5/qhash.html#algorithmic-complexity-attacks

无论如何,关于这个问题的补丁has been merged(更一般来说,它应该解决类似的问题,即使在uic和moc中),因此不应该影响最新版本的Qt。