package rendezvous
type Rendezvous struct {
nodes map [string ]int
nstr []string
nhash []uint64
hash Hasher
}
type Hasher func (s string ) uint64
func New (nodes []string , hash Hasher ) *Rendezvous {
r := &Rendezvous {
nodes : make (map [string ]int , len (nodes )),
nstr : make ([]string , len (nodes )),
nhash : make ([]uint64 , len (nodes )),
hash : hash ,
}
for i , n := range nodes {
r .nodes [n ] = i
r .nstr [i ] = n
r .nhash [i ] = hash (n )
}
return r
}
func (r *Rendezvous ) Lookup (k string ) string {
if len (r .nodes ) == 0 {
return ""
}
khash := r .hash (k )
var midx int
var mhash = xorshiftMult64 (khash ^ r .nhash [0 ])
for i , nhash := range r .nhash [1 :] {
if h := xorshiftMult64 (khash ^ nhash ); h > mhash {
midx = i + 1
mhash = h
}
}
return r .nstr [midx ]
}
func (r *Rendezvous ) Add (node string ) {
r .nodes [node ] = len (r .nstr )
r .nstr = append (r .nstr , node )
r .nhash = append (r .nhash , r .hash (node ))
}
func (r *Rendezvous ) Remove (node string ) {
nidx := r .nodes [node ]
l := len (r .nstr )
r .nstr [nidx ] = r .nstr [l ]
r .nstr = r .nstr [:l ]
r .nhash [nidx ] = r .nhash [l ]
r .nhash = r .nhash [:l ]
delete (r .nodes , node )
moved := r .nstr [nidx ]
r .nodes [moved ] = nidx
}
func xorshiftMult64(x uint64 ) uint64 {
x ^= x >> 12
x ^= x << 25
x ^= x >> 27
return x * 2685821657736338717
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .