遍历DOM树时Jsoup节点哈希码冲突
Jsoup node hash code collision when traversing DOM tree
我正在使用 java jsoup 构建 HTML DOM 树,其中使用了 Node.hashCode()
。但是我发现在遍历DOM树的时候有很多哈希码冲突,使用下面的代码:
doc.traverse(new NodeVisitor(){
@Override
public void head(Node node, int depth) {
System.out.println("node hash: "+ node.hashCode());
/* some other operations */
}
@Override
public void tail(Node node, int depth) {
// TODO Auto-generated method stub
/* some codes */
}
}
所以当这是 运行 时,我什至在前几个输出中看到许多相同的哈希码。
散列码非常大,我不希望出现这种奇怪的行为。我用的是 jsoup-1.8.1。
任何输入将不胜感激,谢谢。
Note: This bug has been fixed in jSoup 1.8.2, so my answer is no longer relevant.
这可能是 jSoup 源代码中的错误。来自 source:
@Override
public int hashCode() {
int result = parentNode != null ? parentNode.hashCode() : 0;
// not children, or will block stack as they go back up to parent)
result = 31 * result + (attributes != null ? attributes.hashCode() : 0);
return result;
}
我不是 Java 专家,但这看起来可能 return 不同节点的相同值,如果它们具有相同的属性。 (和同一位家长,感谢@alkis 的评论)
编辑: 我可以重现这个。使用以下 HTML:
<html>
<head>
</head>
<body>
<div style="blah">TODO: write content</div>
<div style="blah">Nothing here</div>
<p style="test">Empty</p>
<p style="nothing">Empty</p>
</body>
</html>
以及以下代码:
String html = //HTML posted above
Document doc = Jsoup.parse(html);
Elements elements = doc.select("[style]");
for (Element e : elements) {
System.out.println(e.hashCode());
}
它给出:
-148184373
-148184373
-1050420242
2013043377
在计算哈希时似乎完全忽略了内容文本,只有属性很重要。
您或许应该实施自己的解决方法。
已报告错误 here。
我正在使用 java jsoup 构建 HTML DOM 树,其中使用了 Node.hashCode()
。但是我发现在遍历DOM树的时候有很多哈希码冲突,使用下面的代码:
doc.traverse(new NodeVisitor(){
@Override
public void head(Node node, int depth) {
System.out.println("node hash: "+ node.hashCode());
/* some other operations */
}
@Override
public void tail(Node node, int depth) {
// TODO Auto-generated method stub
/* some codes */
}
}
所以当这是 运行 时,我什至在前几个输出中看到许多相同的哈希码。
散列码非常大,我不希望出现这种奇怪的行为。我用的是 jsoup-1.8.1。 任何输入将不胜感激,谢谢。
Note: This bug has been fixed in jSoup 1.8.2, so my answer is no longer relevant.
这可能是 jSoup 源代码中的错误。来自 source:
@Override
public int hashCode() {
int result = parentNode != null ? parentNode.hashCode() : 0;
// not children, or will block stack as they go back up to parent)
result = 31 * result + (attributes != null ? attributes.hashCode() : 0);
return result;
}
我不是 Java 专家,但这看起来可能 return 不同节点的相同值,如果它们具有相同的属性。 (和同一位家长,感谢@alkis 的评论)
编辑: 我可以重现这个。使用以下 HTML:
<html>
<head>
</head>
<body>
<div style="blah">TODO: write content</div>
<div style="blah">Nothing here</div>
<p style="test">Empty</p>
<p style="nothing">Empty</p>
</body>
</html>
以及以下代码:
String html = //HTML posted above
Document doc = Jsoup.parse(html);
Elements elements = doc.select("[style]");
for (Element e : elements) {
System.out.println(e.hashCode());
}
它给出:
-148184373
-148184373
-1050420242
2013043377
在计算哈希时似乎完全忽略了内容文本,只有属性很重要。
您或许应该实施自己的解决方法。
已报告错误 here。