【发布时间】:2017-09-20 04:00:47
【问题描述】:
我正在尝试为 http 请求(对于我的一个项目)添加缓存功能,并且我想使用 Etag 作为哈希值。但如果 Etag 不存在,我想使用有效负载来生成唯一的哈希值。众所周知,相同的 xml 负载可能具有不同的结构。例如样品 A 和样品 B 相同。但它们的字符串结构并不相同。我需要的是一种从两个 xml 样本生成相同哈希键的方法。
样本 A
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
样本 B
<note>
<to>Tove</to>
<heading>Reminder</heading>
<from>Jani</from>
<body>Don't forget me this weekend!</body>
</note>
【问题讨论】:
-
如果顺序在您的应用程序中不重要,您应该将结构标准化为一些规范顺序,然后对其进行哈希处理。
-
以这种方式规范化 XML 的工作量很大。请参阅数字签名 XML 的标准。但是为什么在您的应用程序中会发生这种情况?为什么服务器生成的 XML 在语义上是等效的,但看起来却完全不同?
-
@OliverCharlesworth 我尝试使用
org.w3c.dom.document.normalizeDocument()方法规范化XML 文档,但每次规范化文档时都不会考虑对象的结构。所以我仍然无法获得具有两种不同结构的两个 XML 有效负载的唯一哈希。 -
我实际上建议不要打扰。我的感觉是它实际上不会成为问题,因为 XML 将由软件创建,并且软件很可能生成具有相同元素顺序的 XML。如果有一些奇怪的情况可能不会显着影响缓存性能。 (插入关于过早优化的标准建议。)
-
样本 A 和样本 B 就 XML 而言不相同。您的应用程序可能认为它们是等价的,但 XML 不是。所以无论你做什么规范化都将是特定于应用程序的。