Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/edwingeng/doublejump
A revamped Google's jump consistent hash
https://github.com/edwingeng/doublejump
consistent-hash consistent-hash-algorithm consistent-hashing consistent-hashing-library golang
Last synced: 9 days ago
JSON representation
A revamped Google's jump consistent hash
- Host: GitHub
- URL: https://github.com/edwingeng/doublejump
- Owner: edwingeng
- License: bsd-3-clause
- Created: 2018-06-26T16:04:50.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2022-10-19T16:34:25.000Z (about 2 years ago)
- Last Synced: 2024-07-31T20:51:01.289Z (3 months ago)
- Topics: consistent-hash, consistent-hash-algorithm, consistent-hashing, consistent-hashing-library, golang
- Language: Go
- Homepage:
- Size: 37.1 KB
- Stars: 101
- Watchers: 5
- Forks: 16
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-go - doublejump - A revamped Google's jump consistent hash. (Distributed Systems / Search and Analytic Databases)
- awesome-go-extra - doublejump - 06-26T16:04:50Z|2022-08-03T23:41:57Z| (Distributed Systems / Advanced Console UIs)
README
# Overview
Doublejump is a revamped [Google's jump](https://arxiv.org/pdf/1406.2294.pdf) consistent hash. It overcomes the shortcoming of the original design - being unable to remove nodes. Here is [how it works](https://docs.google.com/presentation/d/e/2PACX-1vTHyFGUJ5CBYxZTzToc_VKxP_Za85AeZqQMNGLXFLP1tX0f9IF_z3ys9-pyKf-Jj3iWpm7dUDDaoFyb/pub?start=false&loop=false&delayms=3000).# 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/opStathatConsistent/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/opSerialxHashring/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
```# Getting Started
### V1
```shell
## If golang version <= 1.17
go get -u github.com/edwingeng/doublejump
```### V2
```shell
## If golang version >= 1.18
go get -u github.com/edwingeng/doublejump/v2
```# Examples
### V1
```go
// 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
```go
// 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](https://github.com/dgryski/go-jump).