package cuckoo import "fmt" // DefaultCapacity is the initial capacity of a [HashTable]. It is inspired from // Java's [HashMap] implementation, which also uses 16. // // [HashMap]: https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html#HashMap-- const DefaultCapacity uint64 = 16 // DefaultGrowthFactor is the standard resize multiplier for a [HashTable]. Most // implementations use 2. const DefaultGrowthFactor uint64 = 2 // defaultMinimumLoad is the default lowest acceptable occupancy of a [HashTable]. // The higher the minimum load, the more likely that a [HashTable.Put] will not // succeed. The value of 5% is taken from [libcuckoo]. // // [libcuckoo]: https://github.com/efficient/libcuckoo/blob/656714705a055df2b7a605eb3c71586d9da1e119/libcuckoo/cuckoohash_config.hh#L21 const defaultMinimumLoad float64 = 0.05 type settings struct { growthFactor uint64 minLoadFactor float64 bucketSize uint64 } // An Option modifies the settings of a [HashTable]. It is used in its constructors // like [New], for example. type Option func(*settings) // Capacity modifies the starting capacity of each table of the [HashTable]. The // value must be non-negative. func Capacity(value int) Option { if value < 0 { panic(fmt.Sprintf("go-cuckoo: Capacity must be non-negative, got %d", value)) } return func(s *settings) { s.bucketSize = uint64(value) } } // GrowthFactor controls how much the capacity of the [HashTable] multiplies when // it must resize. The value must be greater than 1. func GrowthFactor(value int) Option { if value < 2 { panic(fmt.Sprintf("go-cuckoo: GrowthFactor must be greater than 1, got %d", value)) } return func(s *settings) { s.growthFactor = uint64(value) } }