structure/hashmap/hashmap.go
2019-04-18 09:39:44 +08:00

86 lines
1.6 KiB
Go

package hashmap
import (
"474420502.top/eson/structure/compare"
"474420502.top/eson/structure/sparse_array/array3"
)
type HashCode func(key interface{}) uint
type HashMap struct {
growfactor uint
table *array3.Array3
GetHash HashCode
Compare compare.Compare
size uint
}
type bNode struct {
Next *bNode
Key, Value interface{}
}
type Bucket struct {
size uint
head *bNode
}
func HashInt(key interface{}) uint {
thekey := uint(key.(int))
hbit := thekey & 0xffffffff
lbit := (thekey & 0xffffffff00000000) >> 32
return lbit ^ hbit
}
func New(hcode HashCode, comp compare.Compare) *HashMap {
hm := &HashMap{}
hm.growfactor = 2
hm.GetHash = hcode
hm.Compare = comp
hm.table = array3.NewWithCap(hm.growfactor<<2, hm.growfactor<<2, hm.growfactor<<2)
return hm
}
func (hm *HashMap) Put(key, value interface{}) {
hash := hm.GetHash(key)
// log.Println(hm.table.Cap())
index := hash % hm.table.Cap()
n, _ := hm.table.GetOrSet(index, func(data []interface{}, index uint) {
data[index] = avlNew(hm.Compare)
// data[index] = &Bucket{}
})
// bucket := n.(*Bucket)
// cur := bucket.head
// if cur != nil {
// for cur.Next != nil {
// if hm.Compare(key, cur.Key) == 0 {
// cur.Key = key
// cur.Value = value
// return
// }
// cur = cur.Next
// }
// } else {
// bucket.head = &bNode{Value: value, Key: key}
// bucket.size++
// hm.size++
// return
// }
// bn := &bNode{Value: value, Key: key}
// hm.size++
// bucket.size++
// bn.Next = bucket.head
// bucket.head = bn
bucket := n.(*avlTree)
if bucket.Put(key, value) {
hm.size++
}
}