Sha256: 7b9d45886da387db4ec5357dcfa22f7e593c404dc0db677f9025dde23b48e137

Contents?: true

Size: 826 Bytes

Versions: 1

Compression:

Stored size: 826 Bytes

Contents

require 'zlib'
module ConsistentHashr

  @circle = {}
  @number_of_replicas = 20
  
  ##
  # Computes a key
  def self.hash_key(key)
    Zlib.crc32("#{key}")
  end

  ##
  # Adds a server to the circle
  def self.add_server(_name, _server)
    @number_of_replicas.times do |t|
      @circle[hash_key("#{_name}+#{t}")] = _server
    end
  end
  
  ##
  # Returns the server for the provided key
  def self.get(key)
    return nil if @circle.empty?
    return @circle.first.last if @circle.size == 1
    
    hash = hash_key(key)
    
    # If the key is there, let's return it.
    return @circle[hash] if @circle[hash]
    
    # If not, we need to find the next closest from it!
    hash = @circle.keys.select() { |k| k > hash }.sort.first
    
    return @circle.first.last if hash.nil?
    return @circle[hash]
  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
consistent_hashr-1.1.0 lib/consistent_hashr.rb