func (chr *JumpHashRing) GetNodes(key string) []Node {
	ring := make([]Node, 0)
	ret := make([]Node, 0)
	h := Fnv1a64([]byte(key))
	i := len(chr.ring)
	j := 0
	r := chr.replicas
	copy(ring, chr.ring)
	for i > 0 {
		j = Jump(h, i)
		ret = append(ret, chr.ring[j])
		if r--; r <= 0 {
			break
		}
		h = XorShift(h)
		i--
		ring[j] = ring[i]
	}
	return ret
}
GetNodes returns a slice of Node objects one for each replica where the
object is stored.
package main
import (
	"fmt"
	"strings"
)
type Node struct {
	Server   string
	Instance string
}
func XorShift(i uint64) uint64 {
	i ^= i >> 12
	i ^= i << 25
	i ^= i >> 27
	return i * 2685821657736338717
}
func Fnv1a64(data []byte) uint64 {
	var hash uint64 = 14695981039346656037
	for _, d := range data {
		hash = (hash ^ uint64(d)) * 1099511628211
	}
	return hash
}
func Jump(key uint64, buckets int) int {
	var b int64 = -1
	var j int64 = 0
	for j < int64(buckets) {
		b = j
		key = key*2862933555777941757 + 1
		j = int64(float64(b+1) * (float64(1<<31) / float64(key>>33+1)))
	}
	return int(b)
}
type JumpHashRing struct {
	ring     []Node
	replicas int
}
func NewJumpHashRing(replicas int) *JumpHashRing {
	chr := new(JumpHashRing)
	chr.replicas = replicas
	return chr
}
func (chr *JumpHashRing) String() string {
	s := make([]string, 0)
	s = append(s, "jump_fnv1a:")
	for i := range chr.ring {
		s = append(s, fmt.Sprintf("%3d:%s", i, chr.ring[i].Server))
	}
	return strings.Join(s, "\t")
}
func (chr *JumpHashRing) Replicas() int {
	return chr.replicas
}
func (chr *JumpHashRing) Len() int {
	return len(chr.ring)
}
func (chr *JumpHashRing) Nodes() []Node {
	return chr.ring
}
func (chr *JumpHashRing) AddNode(node Node) {
	if node.Instance == "" {
		chr.ring = append(chr.ring, node)
	} else {
		i := 0
		for i = 0; i < chr.Len() && node.Instance <= chr.ring[i].Instance; i++ {
		}
		chr.ring = append(chr.ring, node)   
		copy(chr.ring[i+1:], chr.ring[i:])  
		chr.ring[i] = node                  
	}
}
func (chr *JumpHashRing) RemoveNode(node Node) {
	chr.ring = chr.ring[:len(chr.ring)-1]
}
func (chr *JumpHashRing) GetNode(key string) Node {
	var key64 uint64 = Fnv1a64([]byte(key))
	idx := Jump(key64, len(chr.ring))
	return chr.ring[idx]
}