diff options
| author | Wladimir J. van der Laan <[email protected]> | 2016-11-07 11:50:45 +0100 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2016-11-07 11:51:04 +0100 |
| commit | 5fa7b07565d2c7c1edfb9a2f8c1af42d039d99ee (patch) | |
| tree | 85a1444a1764943bfabd630e94cdc00e0814dee3 /src/base58.cpp | |
| parent | Merge #8708: net: have CConnman handle message sending (diff) | |
| parent | Use prefix operator in for loop of DecodeBase58. (diff) | |
| download | discoin-5fa7b07565d2c7c1edfb9a2f8c1af42d039d99ee.tar.xz discoin-5fa7b07565d2c7c1edfb9a2f8c1af42d039d99ee.zip | |
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/base58.cpp')
| -rw-r--r-- | src/base58.cpp | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/base58.cpp b/src/base58.cpp index d1d60a6f1..f7768b5a6 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. |