Repository: johnzon Updated Branches: refs/heads/master c8b6c1fe0 -> 8c30a68fb
JOHNZON-123 align JsonNumber hash calculation with the spec Txs to Svetlin Zarev for the report! Project: http://git-wip-us.apache.org/repos/asf/johnzon/repo Commit: http://git-wip-us.apache.org/repos/asf/johnzon/commit/8c30a68f Tree: http://git-wip-us.apache.org/repos/asf/johnzon/tree/8c30a68f Diff: http://git-wip-us.apache.org/repos/asf/johnzon/diff/8c30a68f Branch: refs/heads/master Commit: 8c30a68fb646b3e0aff0804e405a2b19c1d20820 Parents: c8b6c1f Author: Mark Struberg <[email protected]> Authored: Tue Aug 29 13:08:39 2017 +0200 Committer: Mark Struberg <[email protected]> Committed: Tue Aug 29 13:08:39 2017 +0200 ---------------------------------------------------------------------- .../main/java/org/apache/johnzon/core/JsonDoubleImpl.java | 8 +++++++- .../src/main/java/org/apache/johnzon/core/JsonLongImpl.java | 6 +++++- .../test/java/org/apache/johnzon/core/JsonNumberTest.java | 9 +++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/johnzon/blob/8c30a68f/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java index daa7b57..3c467e4 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonDoubleImpl.java @@ -27,6 +27,8 @@ import java.util.Objects; final class JsonDoubleImpl implements JsonNumber, Serializable { private final double value; + private Integer hashCode = null; + JsonDoubleImpl(final double value) { if(Double.isInfinite(value) || Double.isNaN(value)) { @@ -100,7 +102,11 @@ final class JsonDoubleImpl implements JsonNumber, Serializable { @Override public int hashCode() { - return Double.valueOf(value).hashCode(); + if (hashCode == null) { + hashCode = bigDecimalValue().hashCode(); + } + + return hashCode; } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/8c30a68f/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java index 0719a3f..5428a87 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonLongImpl.java @@ -25,6 +25,7 @@ import java.math.BigInteger; public final class JsonLongImpl implements JsonNumber, Serializable { private final long value; + private Integer hashCode = null; JsonLongImpl(final long value) { this.value = value; @@ -92,7 +93,10 @@ public final class JsonLongImpl implements JsonNumber, Serializable { @Override public int hashCode() { - return (int) value; + if (hashCode == null) { + hashCode = bigDecimalValue().hashCode(); + } + return hashCode; } @Override http://git-wip-us.apache.org/repos/asf/johnzon/blob/8c30a68f/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java ---------------------------------------------------------------------- diff --git a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java index f994444..2a2a12d 100644 --- a/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java +++ b/johnzon-core/src/test/java/org/apache/johnzon/core/JsonNumberTest.java @@ -86,4 +86,13 @@ public class JsonNumberTest { final JsonNumber jsonNumber = Json.createReader(new StringReader(asJson)).readObject().getJsonNumber("value"); Assert.assertEquals(new BigInteger("10002000000000000000"), jsonNumber.bigIntegerValue()); } + + @Test + public void testHashCode() { + JsonNumber a = Json.createObjectBuilder().add("a", 1).build().getJsonNumber("a"); + JsonNumber b = Json.createObjectBuilder().add("b", 1.1).build().getJsonNumber("b"); + + Assert.assertEquals(a.hashCode(), a.bigDecimalValue().hashCode()); + Assert.assertEquals(b.hashCode(), b.bigDecimalValue().hashCode()); + } }
