diff --git a/base58/src/lib.rs b/base58/src/lib.rs index 7e0f15239..881d5d0f6 100644 --- a/base58/src/lib.rs +++ b/base58/src/lib.rs @@ -69,7 +69,7 @@ static BASE58_DIGITS: [Option; 128] = [ /// Decodes a base58-encoded string into a byte vector. pub fn decode(data: &str) -> Result, InvalidCharacterError> { // 11/15 is just over log_256(58) - let mut scratch = vec![0u8; 1 + data.len() * 11 / 15]; + let mut scratch = Vec::with_capacity(1 + data.len() * 11 / 15); // Build in base 256 for d58 in data.bytes() { // Compute "X = X * 58 + next_digit" in base 256 @@ -82,10 +82,17 @@ pub fn decode(data: &str) -> Result, InvalidCharacterError> { return Err(InvalidCharacterError { invalid: d58 }); } }; - for d256 in scratch.iter_mut().rev() { - carry += u32::from(*d256) * 58; - *d256 = carry as u8; // cast loses data intentionally - carry /= 256; + if scratch.is_empty() { + for _ in 0..scratch.capacity() { + scratch.push(carry as u8); + carry /= 256; + } + } else { + for d256 in scratch.iter_mut() { + carry += u32::from(*d256) * 58; + *d256 = carry as u8; // cast loses data intentionally + carry /= 256; + } } assert_eq!(carry, 0); } @@ -93,7 +100,7 @@ pub fn decode(data: &str) -> Result, InvalidCharacterError> { // Copy leading zeroes directly let mut ret: Vec = data.bytes().take_while(|&x| x == BASE58_CHARS[0]).map(|_| 0).collect(); // Copy rest of string - ret.extend(scratch.into_iter().skip_while(|&x| x == 0)); + ret.extend(scratch.into_iter().rev().skip_while(|&x| x == 0)); Ok(ret) }