Help us shape the future of Go! Take the 2026 Go Developer Survey

doublejump

package module
v1.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 27, 2022 License: BSD-3-Clause Imports: 2 Imported by: 50

README

Overview

Doublejump is a revamped Google's jump consistent hash. It overcomes the shortcoming of the original design - being unable to remove nodes. Here is how it works.

Benchmark

DoubleJump/10-nodes               49276861       22.3 ns/op        0 B/op      0 allocs/op
DoubleJump/100-nodes              33304191       34.9 ns/op        0 B/op      0 allocs/op
DoubleJump/1000-nodes             25261296       46.3 ns/op        0 B/op      0 allocs/op

StathatConsistent/10-nodes         4780832      273.5 ns/op       80 B/op      2 allocs/op
StathatConsistent/100-nodes        4059537      291.8 ns/op       80 B/op      2 allocs/op
StathatConsistent/1000-nodes       3132294      367.6 ns/op       80 B/op      2 allocs/op

SerialxHashring/10-nodes           2766384      455.7 ns/op      152 B/op      5 allocs/op
SerialxHashring/100-nodes          2500936      487.6 ns/op      152 B/op      5 allocs/op
SerialxHashring/1000-nodes         2254138      560.0 ns/op      152 B/op      5 allocs/op

Installation

V1
## If golang version <= 1.17
go get -u github.com/edwingeng/doublejump
V2
## If golang version >= 1.18
go get -u github.com/edwingeng/doublejump/v2

Examples

V1
// If golang version <= 1.17
import "github.com/edwingeng/doublejump"

func Example() {
    h := NewHash()
    for i := 0; i < 10; i++ {
        h.Add(fmt.Sprintf("node%d", i))
    }

    fmt.Println(h.Len())
    fmt.Println(h.LooseLen())

    fmt.Println(h.Get(1000))
    fmt.Println(h.Get(2000))
    fmt.Println(h.Get(3000))

    h.Remove("node3")
    fmt.Println(h.Len())
    fmt.Println(h.LooseLen())

    fmt.Println(h.Get(1000))
    fmt.Println(h.Get(2000))
    fmt.Println(h.Get(3000))

    // Output:
    // 10
    // 10
    // node9
    // node2
    // node3
    // 9
    // 10
    // node9
    // node2
    // node0
}
V2
// If golang version >= 1.18
import "github.com/edwingeng/doublejump/v2"

func Example() {
    h := NewHash[string]()
    for i := 0; i < 10; i++ {
        h.Add(fmt.Sprintf("node%d", i))
    }

    fmt.Println(h.Len())
    fmt.Println(h.LooseLen())

    fmt.Println(h.Get(1000))
    fmt.Println(h.Get(2000))
    fmt.Println(h.Get(3000))

    h.Remove("node3")
    fmt.Println(h.Len())
    fmt.Println(h.LooseLen())

    fmt.Println(h.Get(1000))
    fmt.Println(h.Get(2000))
    fmt.Println(h.Get(3000))

    // Output:
    // 10
    // 10
    // node9 true
    // node2 true
    // node3 true
    // 9
    // 10
    // node9 true
    // node2 true
    // node0 true
}

Acknowledgements

The implementation of the original algorithm is credited to dgryski.

Documentation

Overview

Package doublejump provides a revamped Google's jump consistent hash.

Example
h := NewHash()
for i := 0; i < 10; i++ {
	h.Add(fmt.Sprintf("node%d", i))
}

fmt.Println(h.Len())
fmt.Println(h.LooseLen())

fmt.Println(h.Get(1000))
fmt.Println(h.Get(2000))
fmt.Println(h.Get(3000))

h.Remove("node3")
fmt.Println(h.Len())
fmt.Println(h.LooseLen())

fmt.Println(h.Get(1000))
fmt.Println(h.Get(2000))
fmt.Println(h.Get(3000))
Output:
10
10
node9
node2
node3
9
10
node9
node2
node0

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Hash

type Hash struct {
	// contains filtered or unexported fields
}

Hash is a revamped Google's jump consistent hash. It overcomes the shortcoming of the original implementation - being unable to remove nodes.

Hash is NOT thread-safe.

func NewHash

func NewHash() *Hash

NewHash creates a new doublejump hash instance.

func (*Hash) Add

func (h *Hash) Add(obj interface{})

Add adds an object to the hash.

func (*Hash) All

func (h *Hash) All() []interface{}

All returns all the objects in this Hash.

func (*Hash) Get

func (h *Hash) Get(key uint64) interface{}

Get returns the existing object for the key, or nil if there is no object in the hash.

func (*Hash) Len

func (h *Hash) Len() int

Len returns the number of objects in the hash.

func (*Hash) LooseLen

func (h *Hash) LooseLen() int

LooseLen returns the size of the inner loose object holder.

func (*Hash) Random

func (h *Hash) Random() interface{}

Random returns a random object, or nil if there is no object in the hash.

func (*Hash) Remove

func (h *Hash) Remove(obj interface{})

Remove removes an object from the hash.

func (*Hash) Shrink

func (h *Hash) Shrink()

Shrink removes all empty slots from the hash.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL