QDomDocument toString

时间:2015-06-09 10:10:01

标签: xml dom qt5

运行以下代码每次都不会产生相同的属性排序。为什么会这样?

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每次给出相同的输入时产生相同的结果。

这很重要,因为我想对生成的数据进行单元测试,但是如果数据在运行之间发生变化会使其变得更加困难。

1 个答案:

答案 0 :(得分:2)

QDomDocument通过使用随机区分任意给定键的哈希计算,将QHash which protects itself against algoritmic complexity attacks中的给定节点的属性存储起来盐

当然,出于测试目的,这是一个反特征。 解决方案:运行您的测试用例,将环境变量QT_HASH_SEED 设置为某个整数(0?),然后将其用作盐。

将该变量设置为进程正常并且有效,但是如果您要为当前进程设置它(通过qputenv或类似),请注意您之前需要执行 任何QHash实例都已构建 (由您,或由Qt本身,或由您或其他已加载的库在main之前执行的全局代码,等等) 。所以要非常小心。假设其他库是智能的,在调用任何Qt方法之前强制执行它。