我的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
文件是巨大的,所以我不会在这里显示它们,但基本问题是这些数组的顺序,代表图像,从一个变化调用下一个。
问题
比较构建版本 - 特别是因为我正在切换构建系统 - 我需要能够比较工件。
我希望它们不会改变,以便我可以将构建中的工件输出与构建进行比较,以查看是否有更改。
这是唯一一个给我这个问题的目标文件。
答案 0 :(得分:3)
最有可能是偶然的;在内部,rcc在某处使用QHash
,在其散列函数中使用随机种子:
这是由于散列随机化。这样做是为了避免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。