WIP: Golang HRW implementation
Find a file
Evgeniy Kulikov e5d4b47881
Work around Hashing and tests (#2)
* Work around Hashing and tests

* fixes

* add TravisCI

* fix lint

* so slow

* add badges

* work on README

* Improved tests and get rid of fnv (#3)
2019-01-31 12:54:02 +03:00
.gitignore Base HRW implementation in golang 2019-01-30 01:58:30 +03:00
.travis.yml Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00
go.mod Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00
go.sum Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00
hrw.go Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00
hrw_test.go Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00
LICENSE Initial commit 2019-01-29 22:43:14 +03:00
README.md Work around Hashing and tests (#2) 2019-01-31 12:54:02 +03:00

Golang HRW implementation

Build Status codecov Report GitHub release

Rendezvous or highest random weight (HRW) hashing is an algorithm that allows clients to achieve distributed agreement on a set of k options out of a possible set of n options. A typical application is when clients need to agree on which sites (or proxies) objects are assigned to. When k is 1, it subsumes the goals of consistent hashing, using an entirely different method.

Install

go get github.com/im-kulikov/hrw

Example

package main

import (
	"fmt"
	
	"github.com/im-kulikov/hrw"
)

func main() {
	// given a set of servers
	servers := []string{
		"one.example.com",
		"two.example.com",
		"three.example.com",
		"four.example.com",
		"five.example.com",
		"six.example.com",
	}

	// HRW can consistently select a uniformly-distributed set of servers for
	// any given key
	var (
		key = []byte("/examples/object-key")
		h   = hrw.Hash(key)
	)

	hrw.SortSliceByValue(servers, h)
	for id := range servers {
		fmt.Printf("trying GET %s%s\n", servers[id], key)
	}

	// Output:
	// trying GET four.example.com/examples/object-key
	// trying GET three.example.com/examples/object-key
	// trying GET one.example.com/examples/object-key
	// trying GET two.example.com/examples/object-key
	// trying GET six.example.com/examples/object-key
	// trying GET five.example.com/examples/object-key
}