#base64 #byte-array #base32 #identifier #uuid #ids

fast32

Base32 and base64 encoding in Rust. Primarily for integer (u64, u128) and UUID identifiers, as well as arbitrary byte arrays.

4 stable releases

1.0.3 Oct 3, 2024
1.0.2 Dec 27, 2023
1.0.1 Dec 12, 2023
1.0.0 Dec 11, 2023

#251 in Encoding

Download history 475/week @ 2024-07-20 1185/week @ 2024-07-27 700/week @ 2024-08-03 635/week @ 2024-08-10 1086/week @ 2024-08-17 657/week @ 2024-08-24 1179/week @ 2024-08-31 659/week @ 2024-09-07 1530/week @ 2024-09-14 663/week @ 2024-09-21 662/week @ 2024-09-28 840/week @ 2024-10-05 901/week @ 2024-10-12 598/week @ 2024-10-19 744/week @ 2024-10-26 565/week @ 2024-11-02

2,869 downloads per month
Used in 11 crates (5 directly)

MIT license

200KB
3.5K SLoC

fast32

Base32 and base64 encoding in Rust. Primarily for integer (u64, u128) and UUID identifiers (behind feature uuid), as well as arbitrary byte arrays. And do it all very quickly (more on this below).

The crate has installation instructions, and the documentation has extensive examples.

Encoding integers

Note that by default, encoding an integer into base32 or base64 via normal algorithms does not "look like" a number -- notably the rightmost character usually looks off, and there are sometimes more characters than there needs to be. This might be a plus for obfuscation, barely, but it makes them hard to reason about quickly, and it's also more efficient to process them as integers rather than arbitrary arrays of bytes (because we know upfront that integers are always a small size).

For example, the normal/base10 integer 31 processed normally, as bytes, into official RFC 4648 base32 hex, without padding, will come out as "D4". In contrast, processing it as an integer, as this library can, will come out as "Z" (in Crockford's base32 alphabet) which is more intuitively one less than 32 at "10", as one might hope (vs "EA" in base32 hex -- note that's an A not a 4 so the string changed nonintuitively for an increment of 1). This is helpful with "nice looking" urls of base32 encodings of identifiers, etc.

Speed

This is intended to be as fast as basically possible, while still keeping an intuitive interface.

It is, per the bench comparisons in this repo, on my machine, about 65-100%+ faster than the closest alternative for decoding u64s, and ~15-50%+ faster for encoding u64s, with bigger percent improvements for larger numbers. (That repo does not offer u128 or uuid support to compare against.)

It is also ~35-40% faster on decoding and encoding raw bytes vs the closest other alternative that is more mature but does not offer this crate's integer encoding/decoding, on top of the slower performance. There is an earlier and seemingly long abandoned alternative that is generally about 3x slower than this crate (and thus ~2x slower than the other alternative as well), but still somewhat popular.

Summary

In short, this crate should do everything you want for base32 and base64 encoding (please raise an issue if it doesn't!) while doing all of it very quickly and conveniently.

Dependencies