-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhash.js
More file actions
71 lines (69 loc) · 1.61 KB
/
hash.js
File metadata and controls
71 lines (69 loc) · 1.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//Simple hash functions
//Hash function that works on strings only
function hash(key, arrayLen){
let total = 0;
let WEIRD_PRIME = 31;
for(let i=0; i < Math.min(key.length, 100); i++){
// map "a" to 1, "b" to 2, "c" to 3, etc.
let char = key[i];
let value = char.charCodeAt(0) - 96;
total = (total *WEIRD_PRIME + value) % arrayLen;
}
return total;
}
class HashTable {
constructor(size=53){
this.keyMap = new Array(size);
}
_hash(key){
let total = 0;
let WEIRD_PRIME = 31;
for(let i = 0; i < Math.min(key.length, 100); i++){
let char = key[i];
let value = char.charCodeAt(0) - 96;
total = (total * WEIRD_PRIME + value) % this.keyMap.length;
}
return total;
}
set(key, value){
const index = this._hash(key);
if(!this.keyMap[index]){
this.keyMap[index] = [];
}
this.keyMap[index].push([key, value]);
}
get(key){
const index = this._hash(key);
if(this.keyMap[index]){
for(let i = 0; i < this.keyMap[index].length; i++){
if(this.keyMap[index][i][0] === key){
return this.keyMap[index][i][1];
}
}
}
return undefined;
}
keys(){
let keys = [];
for(let i = 0; i < this.keyMap.length; i++){
if(this.keyMap[i]){
for(let el of this.keyMap[i]){
keys.push(el[0])
}
}
}
return keys;
}
values(){
let values = [];
for(let i = 0; i < this.keyMap.length; i++){
if(this.keyMap[i]){
for(let el of this.keyMap[i]){
if(!values.includes(el[1]))
values.push(el[1])
}
}
}
return values;
}
}