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());
+    }
 }

Reply via email to