Class: Dalli::Ext::Spymemcached::Ring

Inherits:
Ring
  • Object
show all
Defined in:
lib/dalli-ext-spymemcached/ring.rb

Overview

Impliments the same hashing algorithm to chose a server as spymemcached Java library.

Constant Summary collapse

MAX =

32 bit signed int max

2 ** 31 - 1
MIN =

32 bit signed int min

-2 ** 31 # 32 bit signed int min

Instance Method Summary collapse

Instance Method Details

#hash_for(key) ⇒ Object



13
14
15
16
17
18
19
20
21
22
# File 'lib/dalli-ext-spymemcached/ring.rb', line 13

def hash_for(key)
  hashed_key = key.each_byte.inject(0) do |hash, byte|
    hash = 31 * hash + byte
    hash = MAX - (MIN - hash) + 1 while hash < MIN
    hash = MIN - (MAX - hash) - 1 while hash > MAX
    hash
  end

  hashed_key & "ffffffff".hex
end

#server_for_key(key) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/dalli-ext-spymemcached/ring.rb', line 24

def server_for_key(key)
  server = @servers[hash_for(key) % @servers.length] if @servers.any?

  unless server && server.alive?
    raise Dalli::NetworkError, "No servers available"
  end

  server
end