From dd4d2074ea9015564eafb019a9b113d87d66638d Mon Sep 17 00:00:00 2001 From: Carsten Otto Date: Sat, 2 Apr 2022 17:58:20 +0200 Subject: [PATCH] remove expensive regular expression matching for pubkeys --- .../java/de/cotto/lndmanagej/model/Pubkey.java | 10 +++++----- .../de/cotto/lndmanagej/model/PubkeyTest.java | 18 ++++++++++++++++-- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/model/src/main/java/de/cotto/lndmanagej/model/Pubkey.java b/model/src/main/java/de/cotto/lndmanagej/model/Pubkey.java index 5a8cce5b..cd615c56 100644 --- a/model/src/main/java/de/cotto/lndmanagej/model/Pubkey.java +++ b/model/src/main/java/de/cotto/lndmanagej/model/Pubkey.java @@ -3,10 +3,10 @@ package de.cotto.lndmanagej.model; import java.util.Arrays; import java.util.HexFormat; import java.util.Locale; -import java.util.regex.Pattern; public final class Pubkey implements Comparable { - private static final Pattern PATTERN = Pattern.compile("[0-9a-fA-F]{66}"); + private static final int EXPECTED_NUMBER_OF_BYTES = 33; + private final String string; private final byte[] byteArray; private final int hash; @@ -15,12 +15,12 @@ public final class Pubkey implements Comparable { this.string = string; byteArray = HexFormat.of().parseHex(string); hash = Arrays.hashCode(byteArray); + if (byteArray.length != EXPECTED_NUMBER_OF_BYTES) { + throw new IllegalArgumentException(); + } } public static Pubkey create(String string) { - if (!PATTERN.matcher(string).matches()) { - throw new IllegalArgumentException("Pubkey must have 66 hex characters"); - } return new Pubkey(string.toLowerCase(Locale.US)); } diff --git a/model/src/test/java/de/cotto/lndmanagej/model/PubkeyTest.java b/model/src/test/java/de/cotto/lndmanagej/model/PubkeyTest.java index 076bd1cd..4bc15342 100644 --- a/model/src/test/java/de/cotto/lndmanagej/model/PubkeyTest.java +++ b/model/src/test/java/de/cotto/lndmanagej/model/PubkeyTest.java @@ -20,14 +20,28 @@ class PubkeyTest { @Test void too_short() { assertThatIllegalArgumentException().isThrownBy( - () -> Pubkey.create("027abc123abc123abc123abc123123abc123abc123abc123abc123abc123abc12") + () -> Pubkey.create("027abc123abc123abc123abc123123abc123abc123abc123abc123abc123abc1") + ); + } + + @Test + void odd_number_of_characters() { + assertThatIllegalArgumentException().isThrownBy( + () -> Pubkey.create("0") + ); + } + + @Test + void not_hex() { + assertThatIllegalArgumentException().isThrownBy( + () -> Pubkey.create("fg") ); } @Test void too_long() { assertThatIllegalArgumentException().isThrownBy( - () -> Pubkey.create("027abc123abc123abc123abc123123abc123abc123abc123abc123abc123abc123a") + () -> Pubkey.create("027abc123abc123abc123abc123123abc123abc123abc123abc123abc123abc123aa") ); }