From 9bdfdf0012354af595fd572f7c707490be3a1472 Mon Sep 17 00:00:00 2001 From: Shay Gordon Date: Mon, 22 Jun 2020 08:41:30 -0400 Subject: [PATCH 1/3] Faster byte array to hex string generator Signed-off-by: Shay Gordon --- .../main/java/org/web3j/utils/Numeric.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/utils/src/main/java/org/web3j/utils/Numeric.java b/utils/src/main/java/org/web3j/utils/Numeric.java index 377159da7..a0cadc30f 100644 --- a/utils/src/main/java/org/web3j/utils/Numeric.java +++ b/utils/src/main/java/org/web3j/utils/Numeric.java @@ -27,6 +27,7 @@ public final class Numeric { private static final String HEX_PREFIX = "0x"; + private static final char[] HEX_CHAR_MAP = "0123456789abcdef".toCharArray(); private Numeric() {} @@ -227,15 +228,18 @@ public static byte[] hexStringToByteArray(String input) { } public static String toHexString(byte[] input, int offset, int length, boolean withPrefix) { - StringBuilder stringBuilder = new StringBuilder(); - if (withPrefix) { - stringBuilder.append("0x"); - } - for (int i = offset; i < offset + length; i++) { - stringBuilder.append(String.format("%02x", input[i] & 0xFF)); - } + final String output = new String(toHexCharArray(input, offset, length, withPrefix)); + return withPrefix ? new StringBuilder(HEX_PREFIX).append(output).toString() : output; + } - return stringBuilder.toString(); + public static char[] toHexCharArray(byte[] input, int offset, int length, boolean withPrefix) { + final char[] output = new char[length << 1]; + for (int i = offset; i < length; i++) { + final int v = input[i] & 0xFF; + output[i * 2] = HEX_CHAR_MAP[v >>> 4]; + output[i * 2 + 1] = HEX_CHAR_MAP[v & 0x0F]; + } + return output; } public static String toHexString(byte[] input) { From 8bddea984848c4905cf8dde9066c00125b604d9a Mon Sep 17 00:00:00 2001 From: Shay Gordon Date: Mon, 22 Jun 2020 10:49:35 -0400 Subject: [PATCH 2/3] Slightly fster array population Signed-off-by: Shay Gordon --- utils/src/main/java/org/web3j/utils/Numeric.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/utils/src/main/java/org/web3j/utils/Numeric.java b/utils/src/main/java/org/web3j/utils/Numeric.java index a0cadc30f..3e1fb96dc 100644 --- a/utils/src/main/java/org/web3j/utils/Numeric.java +++ b/utils/src/main/java/org/web3j/utils/Numeric.java @@ -234,10 +234,10 @@ public static String toHexString(byte[] input, int offset, int length, boolean w public static char[] toHexCharArray(byte[] input, int offset, int length, boolean withPrefix) { final char[] output = new char[length << 1]; - for (int i = offset; i < length; i++) { + for (int i = offset, j = 0; i < length; i++, j++) { final int v = input[i] & 0xFF; - output[i * 2] = HEX_CHAR_MAP[v >>> 4]; - output[i * 2 + 1] = HEX_CHAR_MAP[v & 0x0F]; + output[j++] = HEX_CHAR_MAP[v >>> 4]; + output[j] = HEX_CHAR_MAP[v & 0x0F]; } return output; } From 17379a95d6ac8f9472a5acbbd730c7de03e63438 Mon Sep 17 00:00:00 2001 From: Shay Gordon Date: Thu, 2 Jul 2020 12:01:16 -0400 Subject: [PATCH 3/3] Make toHexCharArray() private Signed-off-by: Shay Gordon --- utils/src/main/java/org/web3j/utils/Numeric.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/src/main/java/org/web3j/utils/Numeric.java b/utils/src/main/java/org/web3j/utils/Numeric.java index 3e1fb96dc..79f5fe7b2 100644 --- a/utils/src/main/java/org/web3j/utils/Numeric.java +++ b/utils/src/main/java/org/web3j/utils/Numeric.java @@ -232,7 +232,7 @@ public static String toHexString(byte[] input, int offset, int length, boolean w return withPrefix ? new StringBuilder(HEX_PREFIX).append(output).toString() : output; } - public static char[] toHexCharArray(byte[] input, int offset, int length, boolean withPrefix) { + private static char[] toHexCharArray(byte[] input, int offset, int length, boolean withPrefix) { final char[] output = new char[length << 1]; for (int i = offset, j = 0; i < length; i++, j++) { final int v = input[i] & 0xFF;