56 lines
1.9 KiB
Go
56 lines
1.9 KiB
Go
package cuckoo
|
|
|
|
import "fmt"
|
|
|
|
// DefaultCapacity is the initial capacity of a [Table]. 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 [Table]. Most
|
|
// hash table implementations use 2.
|
|
const DefaultGrowthFactor uint64 = 2
|
|
|
|
// defaultMinimumLoad is the default lowest acceptable occupancy of a [Table].
|
|
// The higher the minimum load, the more likely that a [Table.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
|
|
|
|
// defaultGrowthLimit is the maximum number of times a [Table] can grow in a
|
|
// single [Table.Put], before the library infers it will lead to a stack
|
|
// overflow. The value of '64' was chosen arbirarily.
|
|
const defaultGrowthLimit uint64 = 64
|
|
|
|
type settings struct {
|
|
growthFactor uint64
|
|
minLoadFactor float64
|
|
bucketSize uint64
|
|
}
|
|
|
|
// An Option modifies the settings of a [Table]. It is used in its constructors
|
|
// like [NewTable], for example.
|
|
type Option func(*settings)
|
|
|
|
// Capacity modifies the starting capacity of each bucket of the [Table]. 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 [Table] 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) }
|
|
}
|