aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorWladimir J. van der Laan <laanwj@gmail.com>2016-11-07 11:50:45 +0100
committerWladimir J. van der Laan <laanwj@gmail.com>2016-11-07 11:51:04 +0100
commit5fa7b07565d2c7c1edfb9a2f8c1af42d039d99ee (patch)
tree85a1444a1764943bfabd630e94cdc00e0814dee3 /src
parentc8c572f8f1ea0a98ee3e7b3343c766ad52848bef (diff)
parente892dc1268d33bfba01f35b70359b286bb9d6376 (diff)
downloadbitcoin-5fa7b07565d2c7c1edfb9a2f8c1af42d039d99ee.tar.xz
Merge #8736: base58: Improve DecodeBase58 performance.
e892dc1 Use prefix operator in for loop of DecodeBase58. (Jiaxing Wang) 159ed95 base58: Improve DecodeBase58 performance. (Jiaxing Wang)
Diffstat (limited to 'src')
-rw-r--r--src/base58.cpp10
1 files changed, 7 insertions, 3 deletions
diff --git a/src/base58.cpp b/src/base58.cpp
index d1d60a6f1d..f7768b5a64 100644
--- a/src/base58.cpp
+++ b/src/base58.cpp
@@ -25,12 +25,14 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
psz++;
// Skip and count leading '1's.
int zeroes = 0;
+ int length = 0;
while (*psz == '1') {
zeroes++;
psz++;
}
// Allocate enough space in big-endian base256 representation.
- std::vector<unsigned char> b256(strlen(psz) * 733 / 1000 + 1); // log(58) / log(256), rounded up.
+ int size = strlen(psz) * 733 /1000 + 1; // log(58) / log(256), rounded up.
+ std::vector<unsigned char> b256(size);
// Process the characters.
while (*psz && !isspace(*psz)) {
// Decode base58 character
@@ -39,12 +41,14 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
return false;
// Apply "b256 = b256 * 58 + ch".
int carry = ch - pszBase58;
- for (std::vector<unsigned char>::reverse_iterator it = b256.rbegin(); it != b256.rend(); it++) {
+ int i = 0;
+ for (std::vector<unsigned char>::reverse_iterator it = b256.rbegin(); (carry != 0 || i < length) && (it != b256.rend()); ++it, ++i) {
carry += 58 * (*it);
*it = carry % 256;
carry /= 256;
}
assert(carry == 0);
+ length = i;
psz++;
}
// Skip trailing spaces.
@@ -53,7 +57,7 @@ bool DecodeBase58(const char* psz, std::vector<unsigned char>& vch)
if (*psz != 0)
return false;
// Skip leading zeroes in b256.
- std::vector<unsigned char>::iterator it = b256.begin();
+ std::vector<unsigned char>::iterator it = b256.begin() + (size - length);
while (it != b256.end() && *it == 0)
it++;
// Copy result into output vector.