gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:04:09 27 4
gpt4 key购买 nike

我的 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 文件很大,所以我不会在这里展示它们,但基本问题是这些数组的顺序,表示图像,从一次调用到下一次调用发生变化。

问题

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

我希望它们不发生变化,这样我就可以比较构建与构建之间的工件输出,看看是否发生了变化。

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

最佳答案

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

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

It's due to the hash randomisation. This was done to avoid DoS attacks that can be performed by tweaking data to ensure it always falls into the same hash bucket.

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

This randomization of QHash is enabled by default. Even though programs should never depend on a particular QHash ordering, there may be situations where you temporarily need deterministic behavior, for example for debugging or regression testing. To disable the randomization, define the environment variable QT_HASH_SEED. The contents of that variable, interpreted as a decimal value, will be used as the seed for qHash(). Alternatively, you can call the qSetGlobalQHashSeed() function.

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


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

关于c++ - qt rcc(资源编译器)是非确定性的——如何使其具有确定性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38926392/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com