Base 62 is a mathematical numeral systems that uses sixty-two distinct characters as its base. Most implementations use the numbers 0 – 9 to represent values from zero to nine, and letters a – z and A – Z to represent values from ten to sixty-one.
The encode method of base62 transforms a decimal number (Base 10) to Base 62, while the decode method reverse the process. For example: a decimal number
3781504209452600 can be encoded to
hjNv8tS3K should be decoded back as
3781504209452600 vice versa. Clearly, it is a one to one map between two systems.
Base62 encoding schemes are commonly used for URL shortening service. You can regard the decimal number
3781504209452600 as an unique ID of a link or record in your database, and encoding it to base62 can provide a url like this:
http://yourdomain.com/hjNv8tS3K as a shorten link for retrieving the record of the integer ID.
I’ve written a base62 implementation in Ruby, and you can find it on Github: https://github.com/steventen/base62-rb. The algorithms for encoding and decoding are not hard, I believe you can easily understand them by reading the source code here.
There are several base62 libraries written in Ruby already, and all of the libraries in fact use the same math algorithm. However, with different implementation, and different Ruby language features, I find speed performance can be quite different. As it turns out, my implementation could reach at most 3 times faster than others.
I have included each implementations and compared them accordingly in the benchmark.
The encoding part mainly includes loop, string concatenation, and divide operation. Benchmarks of different implementations are described here.
The decoding method contains loop, exponentiation operation, index lookup, and addition operation. The benchmarks of various implementations are shown here.
Lesson learned: as a software engineer, understand and master the tools (e.g. the programming language) you are using is really important.