hashmaps

package module
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Jun 4, 2023 License: MIT Imports: 4 Imported by: 0

Documentation

Overview

Package hashmaps implements several types of hash tables.

Example
package main

import (
	"fmt"

	"github.com/EinfachAndy/hashmaps"
)

func main() {
	m := hashmaps.NewRobinHood[string, int]()
	m.Put("foo", 42)
	m.Put("bar", 13)

	fmt.Println(m.Get("foo"))
	fmt.Println(m.Get("baz"))

	m.Remove("foo")

	fmt.Println(m.Get("foo"))
	fmt.Println(m.Get("bar"))

	m.Clear()

	fmt.Println(m.Get("foo"))
	fmt.Println(m.Get("bar"))
}
Output:
42 true
0 false
0 false
13 true
0 false
0 false

Index

Examples

Constants

This section is empty.

Variables

This section is empty.

Functions

func Max

func Max[T Ordered](a, b T) T

Max returns the max of a and b.

func Min

func Min[T Ordered](a, b T) T

Min returns the min of a and b.

func NextPowerOf2

func NextPowerOf2(i uint64) uint64

NextPowerOf2 is a fast computation of 2^x see: https://stackoverflow.com/questions/466204/rounding-up-to-next-power-of-2

Types

type HashFn

type HashFn[T any] func(t T) uintptr

HashFn is a function that returns the hash of 't'.

func GetHasher

func GetHasher[Key any]() HashFn[Key]

GetHasher returns a hasher for the given type

type IHashMap

type IHashMap[K comparable, V any] struct {
	Get     func(key K) (V, bool)
	Reserve func(n uintptr)
	Load    func() float32
	Put     func(key K, val V) bool
	Remove  func(key K) bool
	Clear   func()
	Size    func() int
	Each    func(fn func(key K, val V) bool)
}

IHashMap collects the basic hash maps operations as function points.

type Ordered

type Ordered interface {
	~int | ~int8 | ~int16 | ~int32 | ~int64 |
		~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
		~float32 | ~float64 |
		~string
}

Ordered is a constraint that permits any ordered type: any type that supports the operators < <= >= >.

type RobinHood

type RobinHood[K comparable, V any] struct {
	// contains filtered or unexported fields
}

RobinHood is a hash map that uses linear probing in combination with robin hood hashing as collision strategy. The hashmap resizes if the max PSL reached log2(n). This means that all operations including Get, Put, Remove have a worse case performance of O(log(n)). The expected max PSL for a full robin hood hash map is O(ln(n)), means a resizing happens at a expected default load of 0.8. The max load factor can be changed with `MaxLoad()`. The result is a good trade off between performance and memory consumption. Note that the performance for a open addressing hash map depends also on the key and value size. For higher storage sizes for the keys and values use a hashmap that uses another strategy like the golang std map.

func NewRobinHood

func NewRobinHood[K comparable, V any]() *RobinHood[K, V]

NewRobinHood creates a ready to use `RobinHood` hash map with default settings.

func NewRobinHoodWithHasher

func NewRobinHoodWithHasher[K comparable, V any](hasher HashFn[K]) *RobinHood[K, V]

NewRobinHoodWithHasher same as `NewRobinHood` but with a given hash function.

func (*RobinHood[K, V]) Clear

func (m *RobinHood[K, V]) Clear()

Clear removes all key-value pairs from the map.

func (*RobinHood[K, V]) Copy

func (m *RobinHood[K, V]) Copy() *RobinHood[K, V]

Copy returns a copy of this map.

func (*RobinHood[K, V]) Each

func (m *RobinHood[K, V]) Each(fn func(key K, val V) bool)

Each calls 'fn' on every key-value pair in the hash map in no particular order. If 'fn' returns true, the iteration stops.

func (*RobinHood[K, V]) Get

func (m *RobinHood[K, V]) Get(key K) (V, bool)

Get returns the value stored for this key, or false if there is no such value.

func (*RobinHood[K, V]) Load

func (m *RobinHood[K, V]) Load() float32

Load return the current load of the hash map.

func (*RobinHood[K, V]) MaxLoad

func (m *RobinHood[K, V]) MaxLoad(lf float32) error

MaxLoad forces resizing if the ratio is reached. useful values are in range [0.5-0.9]

func (*RobinHood[K, V]) Put

func (m *RobinHood[K, V]) Put(key K, val V) bool

Put maps the given key to the given value. If the key already exists its value will be overwritten with the new value. Signals if the key is new in the map.

func (*RobinHood[K, V]) Remove

func (m *RobinHood[K, V]) Remove(key K) bool

Remove removes the specified key-value pair from the map. Returns true, if the element was in the hash map.

func (*RobinHood[K, V]) Reserve

func (m *RobinHood[K, V]) Reserve(n uintptr)

Reserve sets the number of buckets to the most appropriate to contain at least n elements. If n is lower than that, the function may have no effect.

func (*RobinHood[K, V]) Size

func (m *RobinHood[K, V]) Size() int

Size returns the number of items in the map.

Jump to

Keyboard shortcuts

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