Skip to content

jpgreninger/deflate_ruby

Repository files navigation

DeflateRuby

Ruby bindings for libdeflate, a heavily optimized library for DEFLATE, gzip, and zlib compression and decompression.

DeflateRuby provides significantly faster compression and decompression compared to Ruby's built-in Zlib module, while maintaining full compatibility with standard DEFLATE, gzip, and zlib formats.

Features

  • Fast compression and decompression - Leverages libdeflate's heavily optimized implementation
  • Multiple compression formats - Support for raw DEFLATE, zlib, and gzip formats
  • Configurable compression levels - Levels 0-12 (higher = better compression, slower)
  • Checksum functions - CRC32 and Adler32 implementations
  • Cross-platform - Works on x86, ARM, and RISC-V architectures
  • Clean API - Simple, Ruby-friendly interface

Installation

Install the gem by executing:

gem install deflate_ruby

Or add to your Gemfile:

gem 'deflate_ruby'

Usage

Compression

require 'deflate_ruby'

# Create a compressor
compressor = DeflateRuby::Compressor.new(level: 6)  # level 0-12, default 6

# Compress data in different formats
data = "Hello, World!" * 100

# Raw DEFLATE
deflated = compressor.deflate_compress(data)

# Zlib format (with header and checksum)
zlib_compressed = compressor.zlib_compress(data)

# Gzip format (with header and checksum)
gzip_compressed = compressor.gzip_compress(data)

# Always close the compressor when done
compressor.close

Decompression

# Create a decompressor
decompressor = DeflateRuby::Decompressor.new

# Decompress data (must know original size)
original_data = decompressor.deflate_decompress(deflated, data.bytesize)
original_data = decompressor.zlib_decompress(zlib_compressed, data.bytesize)
original_data = decompressor.gzip_decompress(gzip_compressed, data.bytesize)

# Always close the decompressor when done
decompressor.close

Checksums

# CRC32
crc = DeflateRuby.crc32("Hello, World!")

# CRC32 with initial value (for incremental calculation)
crc1 = DeflateRuby.crc32("Hello, ")
crc2 = DeflateRuby.crc32("World!", crc1)

# Adler32
adler = DeflateRuby.adler32("Hello, World!")

# Adler32 with initial value
adler1 = DeflateRuby.adler32("Hello, ")
adler2 = DeflateRuby.adler32("World!", adler1)

Compression Bounds

# Get worst-case compressed size for a given input size
compressor = DeflateRuby::Compressor.new
bound = compressor.deflate_compress_bound(1000)
zlib_bound = compressor.zlib_compress_bound(1000)
gzip_bound = compressor.gzip_compress_bound(1000)
compressor.close

Performance

DeflateRuby is significantly faster than Ruby's built-in Zlib for both compression and decompression, especially at higher compression levels. Benchmarks show 2-5x performance improvements depending on the data and compression level.

Development

After checking out the repo:

cd deflate_ruby
bundle install

To compile the extension:

rake compile

To run tests:

rake test

To build the gem:

rake build

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/jgreninger/deflate_ruby.

License

The gem is available as open source under the terms of the MIT License.

This gem bundles libdeflate, which is also licensed under the MIT License.

About

Updated t o include all interfaces

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages