1
- package data - structures
1
+ package hashmap
2
2
3
3
import (
4
4
"fmt"
@@ -13,20 +13,23 @@ type node struct {
13
13
next * node
14
14
}
15
15
16
- type hashMap struct {
16
+ // HashMap is golang implementation of hashmap
17
+ type HashMap struct {
17
18
capacity uint64
18
19
size uint64
19
20
table []* node
20
21
}
21
22
22
- func newHashMap () * hashMap {
23
- return & hashMap {
23
+ // New return new HashMap instance
24
+ func New () * HashMap {
25
+ return & HashMap {
24
26
capacity : defaultCapacity ,
25
27
table : make ([]* node , defaultCapacity ),
26
28
}
27
29
}
28
30
29
- func (hm * hashMap ) get (key interface {}) interface {} {
31
+ // Get returns value associated with given key
32
+ func (hm * HashMap ) Get (key interface {}) interface {} {
30
33
node := hm .getNodeByHash (hm .hash (key ))
31
34
32
35
if node != nil {
@@ -36,11 +39,23 @@ func (hm *hashMap) get(key interface{}) interface{} {
36
39
return nil
37
40
}
38
41
39
- func (hm * hashMap ) put (key interface {}, value interface {}) interface {} {
42
+ // Put puts new key value in hashmap
43
+ func (hm * HashMap ) Put (key interface {}, value interface {}) interface {} {
40
44
return hm .putValue (hm .hash (key ), key , value )
41
45
}
42
46
43
- func (hm * hashMap ) putValue (hash uint64 , key interface {}, value interface {}) interface {} {
47
+ // Contains checks if given key is stored in hashmap
48
+ func (hm * HashMap ) Contains (key interface {}) bool {
49
+ node := hm .getNodeByHash (hm .hash (key ))
50
+
51
+ if node != nil {
52
+ return true
53
+ }
54
+
55
+ return false
56
+ }
57
+
58
+ func (hm * HashMap ) putValue (hash uint64 , key interface {}, value interface {}) interface {} {
44
59
if hm .capacity == 0 {
45
60
hm .capacity = defaultCapacity
46
61
hm .table = make ([]* node , defaultCapacity )
@@ -66,21 +81,11 @@ func (hm *hashMap) putValue(hash uint64, key interface{}, value interface{}) int
66
81
67
82
}
68
83
69
- func (hm * hashMap ) contains (key interface {}) bool {
70
- node := hm .getNodeByHash (hm .hash (key ))
71
-
72
- if node != nil {
73
- return true
74
- }
75
-
76
- return false
77
- }
78
-
79
- func (hm * hashMap ) getNodeByHash (hash uint64 ) * node {
84
+ func (hm * HashMap ) getNodeByHash (hash uint64 ) * node {
80
85
return hm .table [hash ]
81
86
}
82
87
83
- func (hm * hashMap ) resize () {
88
+ func (hm * HashMap ) resize () {
84
89
hm .capacity <<= 1
85
90
86
91
tempTable := hm .table
@@ -112,30 +117,11 @@ func newNodeWithNext(key interface{}, value interface{}, next *node) *node {
112
117
}
113
118
}
114
119
115
- func (hm * hashMap ) hash (key interface {}) uint64 {
120
+ func (hm * HashMap ) hash (key interface {}) uint64 {
116
121
h := fnv .New64a ()
117
- h .Write ([]byte (fmt .Sprintf ("%v" , key )))
122
+ _ , _ = h .Write ([]byte (fmt .Sprintf ("%v" , key )))
118
123
119
124
hashValue := h .Sum64 ()
120
125
121
126
return (hm .capacity - 1 ) & (hashValue ^ (hashValue >> 16 ))
122
127
}
123
-
124
- // func main() {
125
- // hashMap := newHashMap()
126
-
127
- // hashMap.put("test-1", 10)
128
- // fmt.Println(hashMap.get("test-1"))
129
-
130
- // hashMap.put("test-1", 20)
131
- // hashMap.put("test-2", 30)
132
- // hashMap.put(1, 40)
133
-
134
- // fmt.Println(hashMap.get("test-1"))
135
- // fmt.Println(hashMap.get("test-2"))
136
- // fmt.Println(hashMap.get(1))
137
-
138
- // fmt.Println(hashMap.contains(2))
139
- // fmt.Println(hashMap.contains(1))
140
- // fmt.Println(hashMap.contains("test-1"))
141
- // }
0 commit comments