Skip to content

eduardordm/gelatin

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Gelatin: A Jump Consistent Hash Ruby Gem

Build Status

This gem exposes the Google's consistent hash algorithm to ruby. It uses the original, mostly unmodified, implementation as described by "A Fast, Minimal Memory, Consistent Hash Algorithm".

You can use this gem as a consistent hasher or to create a ring of servers like the ones used in Amazon DynamoDB, Cassandra, etc. You could use it as some sort of novel cluster implementation also. It will evenly distribute your clients among the servers and remap them when the number of nodes changes.

It containst no collision detection if you plan to use this as the main hasher for object storage, you might need add aditional steps in your underlying storage implementation.

The performance is good: In a ring of 1.8mi servers and 2mi clients it returned the desired server within < 0.01 ms on my 4 year old laptop. As long as Array#[] stays O(1) you should be fine.

"Google has not applied for patent protection for this algorithm, and, as of this writing, has no plans to. Rather, it wishes to contribute this algorithm to the community."

Installation

Add this line to your application's Gemfile:

gem 'gelatin'

And then execute:

$ bundle

Or install it yourself as:

$ gem install gelatin

Usage

If you need just a simple hasher:

require 'jch'

key = rand(2**32..2**64-1)

# The hash method takes two BIGNUMs.
# the first is the key to which you are trying to find a node to.
# The second is the quantity of available nodes.
my_node = hash(key, 1000000)

If you are using this as a Server Ring (main purpose of this gem):

sh = Gelatin::Ring.new
(1...254).each do |i|
  sh.add Gelatin::Node.new("192.168.0.#{i}")
end
puts sh.get(::Zlib::crc32("s3.amazon.com")) # returns the server for this key

You might use the same hasher to hash long strings like file paths, but you need to split the string into 64bit chunks.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

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

License

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

About

Gelatin: A Jump Consistent Hash Gem

Resources

License

Stars

Watchers

Forks

Packages

No packages published