每次运行以下代码不会产生相同的属性顺序。为什么会发生这种情况?
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都能产生相同的结果。
这一点很重要,因为我想对生成的数据进行单元测试,但如果数据在运行之间发生变化,则会使测试变得更加困难。
QDomDocument
将给定节点的属性存储在QHash
中,通过使用随机盐对任何给定密钥的哈希计算进行盐析,从而保护自己免受算法复杂性攻击。
当然,出于测试目的,这是一个反功能解决方案:在环境变量QT_HASH_SEED
设置为某个整数(0?(的情况下运行测试用例,然后将其用作salt。
在进程外设置该变量是可以的,并且有效,但如果您想为当前进程设置该变量(通过qputenv
或类似方式(,请注意,在构建任何QHash
实例之前,您需要执行(由您、Qt本身、或由您或其他加载的库在main
之前执行的全局代码,等等(。所以要非常小心。假设其他库是智能的,那么在调用任何Qt方法之前强制执行它。