Snappy (compression)
Snappy (previously known as Zippy) is a fast data compression and decompression library written in C++ by Google based on ideas from LZ77 and open-sourced in 2011. It does not aim for maximum compression, or compatibility with any other compression library; instead, it aims for very high speeds and reasonable compression. Compression speed is 250 MB/s and decompression speed is 500 MB/s using a single core of a circa 2011 "Westmere" 2.26 GHz Core i7 processor running in 64-bit mode. The compression ratio is 20–100% lower than gzip. Snappy is widely used in Google  projects like Bigtable, MapReduce and in compressing data for Google's internal RPC systems. It can be used in open-source projects like MariaDB ColumnStore, Cassandra, Couchbase, Hadoop, LevelDB, MongoDB, RocksDB, Lucene, Spark, and InfluxDB. Decompression is tested to detect any errors in the compressed stream. Snappy does not use inline assembler (except some optimizations) and is portable. Stream format. Snappy encoding is not bit-oriented, but byte-oriented (only whole bytes are emitted or consumed from a stream). The format uses no entropy encoder, like Huffman tree or arithmetic encoder. The first bytes of the stream are the length  of uncompressed data, stored as a little-endian varint, which allows for variable-length encoding. The lower seven bits of each byte are used for data and the high bit is a flag to indicate the end of the length field. The remaining bytes in the stream are encoded using one of four element types. The element type is encoded in the lower two bits of the first byte ("tag byte") of the element: The copy refers to the dictionary (just-decompressed data). The offset is the shift from the current position back to the already decompressed stream. The length  is the number of bytes to copy from the dictionary. The size of the dictionary was limited by the 1.0 Snappy compressor to 32,768 bytes, and updated to 65,536 in version 1.1. The complete official description of the snappy format can be found in the google GitHub repository. Example of a compressed stream. The text may be compressed to this, shown as hex data with explanations: The first 2 bytes, "ca02" are the length, as a little-endian varint (see Protocol Buffers for the varint specification). Thus the most-significant byte is '02' . 0x02ca(varint) = 0x014a = 330 bytes. The  next two bytes, 0xf042, indicate that a literal of 66+1 bytes follows 0x09 is tag-byte of type 01 with length - 4 = 010 = 2 and offset = 0x03f = 63 or "pedia "; 0xf014 is a literal with length of 20+1 bytes In this example, all common substrings with four or more characters were eliminated by the compression process. More common compressors can compress this better. Unlike compression methods such as gzip and bzip2, there is no entropy encoding used to pack alphabet into the bit stream. Interfaces. Snappy distributions include C++ and C bindings . Third party-provided bindings and ports include C#, Common Lisp, Crystal (programming language), Erlang, Go, Haskell, Lua, Java, Nim, Node.js, Perl, PHP, Python, R, Ruby, Rust, Smalltalk, and OpenCL.