diff --git a/core/src/main/java/org/bitcoinj/core/ECKey.java b/core/src/main/java/org/bitcoinj/core/ECKey.java index fbf3c5253..a796d0ccb 100644 --- a/core/src/main/java/org/bitcoinj/core/ECKey.java +++ b/core/src/main/java/org/bitcoinj/core/ECKey.java @@ -1219,10 +1219,7 @@ public class ECKey implements EncryptableItem { @Override public int hashCode() { - // Public keys are random already so we can just use a part of them as the hashcode. Read from the start to - // avoid picking up the type code (compressed vs uncompressed) which is tacked on the end. - byte[] bits = getPubKey(); - return Ints.fromBytes(bits[0], bits[1], bits[2], bits[3]); + return pub.hashCode(); } @Override diff --git a/core/src/test/java/org/bitcoinj/core/ECKeyTest.java b/core/src/test/java/org/bitcoinj/core/ECKeyTest.java index 0df376ae0..2246c15b4 100644 --- a/core/src/test/java/org/bitcoinj/core/ECKeyTest.java +++ b/core/src/test/java/org/bitcoinj/core/ECKeyTest.java @@ -454,4 +454,14 @@ public class ECKeyTest { for (byte b : bytes) if (b != 0) return true; return false; } + + @Test + public void testPublicKeysAreEqual() { + ECKey key = new ECKey(); + ECKey pubKey1 = ECKey.fromPublicOnly(key.getPubKeyPoint()); + assertTrue(pubKey1.isCompressed()); + ECKey pubKey2 = pubKey1.decompress(); + assertEquals(pubKey1, pubKey2); + assertEquals(pubKey1.hashCode(), pubKey2.hashCode()); + } }