运行以下代码每次都不会产生相同的属性排序。为什么会这样?
QDomDocument dom;
QDomElement element= dom.createElement("MyElement");
element.setAttribute("attr1", "foo");
element.setAttribute("attr2", "bar");
element.setAttribute("attr3", "hello");
dom.appendChild(element);
QString text = dom.toString();
我知道xml规范说属性的排序并不重要,但我希望QDomDocument :: toString每次给出相同的输入时产生相同的结果。
这很重要,因为我想对生成的数据进行单元测试,但是如果数据在运行之间发生变化会使其变得更加困难。
答案 0 :(得分:2)
QDomDocument
通过使用随机区分任意给定键的哈希计算,将QHash
,which protects itself against algoritmic complexity attacks中的给定节点的属性存储起来盐强>
当然,出于测试目的,这是一个反特征。 解决方案:运行您的测试用例,将环境变量QT_HASH_SEED
设置为某个整数(0?),然后将其用作盐。
将该变量设置为进程正常并且有效,但是如果您要为当前进程设置它(通过qputenv
或类似),请注意您之前需要执行 任何QHash
实例都已构建 (由您,或由Qt本身,或由您或其他已加载的库在main
之前执行的全局代码,等等) 。所以要非常小心。假设其他库是智能的,在调用任何Qt方法之前强制执行它。