gpt4 book ai didi

java - 在 Java 中为 XML 生成 SHA-256 哈希

转载 作者:行者123 更新时间:2023-11-30 10:30:50 25 4
gpt4 key购买 nike

我正在尝试为 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>

最佳答案

org.w3c.dom.document.normalizeDocument() 文档不会改变子元素的顺序。

可以通过文档的递归解析来做到这一点。但是,请考虑这是否比您首先尝试缓存的操作更昂贵...

方法

  • 在每个级别将所有节点复制到 java.util.List 实现,即 ArrayList。这是必需的,因为 org.w3c.dom.NodeList 不允许修改
  • 使用 Collections.sort() 对列表进行排序
  • 将子项从其父项中移除
  • 按排序顺序添加 child

请注意,这不会处理具有不同内容的多个同名元素,但会解决您的示例

例如:

public static void main(String[] args) throws Exception {
Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File("test.xml"));
sort(doc);

TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));

System.out.println(writer);
}

private static void sort(Node doc) {
List<Node> children = new ArrayList<>();
for (int i = 0; i < doc.getChildNodes().getLength(); i++) {
children.add(doc.getChildNodes().item(i));
}
for (Node child : children) {
doc.removeChild(child);
}
Collections.sort(children, (a, b) -> {
return a.getNodeName().compareTo(b.getNodeName());
});
for (Node child : children) {
doc.appendChild(child);
}
for (Node child : children) {
sort(child);
}
}

关于java - 在 Java 中为 XML 生成 SHA-256 哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571694/

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