我有一个用Java编写的JSON Schema实现,它依赖于 杰克逊 (版本2.1.x)。出于准确性原因,我告诉杰克逊使用 BigDecimal
对于浮点数。
对于JSON Schema的需求,特别需要:对于数值,JSON值相等由其数学值的相等性定义。我需要这种检查,因为,例如,这不是一个合法的模式(一个中的值) enum
应该是独一无二的):
{ "enum": [ 1, 1.0 ] }
但JsonNodes为 1
和 1.0
不平等因此,我编写了番石榴的实现 等价,并使用 Set<Equivalence.Wrapper<JsonNode>>
在适当情况下。此实现应适用于所有类型的节点,而不仅仅是数字节点。
而这个实现中最困难的部分原来是 doHash()
对于数字节点:/我需要 相同数学值的相同哈希码,无论是整数还是浮点数。
我现在能想到的最好的是:
@Override
protected int doHash(final JsonNode t)
{
/*
* If this is a numeric node, we want a unique hashcode for all possible
* number nodes.
*/
if (t.isNumber()) {
final BigDecimal decimal = t.decimalValue();
try {
return decimal.toBigIntegerExact().hashCode();
} catch (ArithmeticException ignored) {
return decimal.stripTrailingZeros().hashCode();
}
}
// etc etc -- the rest works fine
目前,这是我能想到的最好的。
有没有更好的方法来计算这样的哈希码?
(编辑:等效实现的完整代码 这里)