1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>开链散列</title> 6 </head> 7 <body> 8 <script> 9 function HashTable(){ 10 this.table = new Array(137); 11 this.betterHash = betterHash; 12 this.showDistro = showDistro; 13 this.put = put; 14 this.get = get; 15 this.buildChains = buildChains; 16 } 17 18 function betterHash(data){ 19 const H =37; 20 var total = 0; 21 for(var i=0;i<data.length;i++){ 22 total += H*total + data.charCodeAt(i); 23 24 } 25 total %= this.table.length; 26 if(total <0){ 27 total += this.table.length-1; 28 } 29 console.log(data+"->"+ total % this.table.length); 30 return parseInt(total); 31 } 32 function put(key,data){ 33 var pos = this.betterHash(key); 34 var index = 0; 35 if(this.table[pos][index] == undefined ){ 36 this.table[pos][index+1] = data; 37 this.table[pos][0] = key; 38 index++; 39 }else{ 40 while(this.table[pos][index] != undefined ){ 41 index++; 42 } 43 this.table[pos][index+1] = data; 44 } 45 } 46 function showDistro(){ 47 for(var i = 0;i<this.table.length;i++){ 48 if(this.table[i][0] != undefined){ 49 console.log(this.table[i][0],":",this.table[i]); 50 } 51 } 52 } 53 function get(key){ 54 var index = 0; 55 var pos = this.betterHash(key); 56 if(this.table[pos][index] == key){ 57 return this.table[pos][index+1]; 58 index+=2; 59 }else{ 60 while(this.table[pos][index] != key){ 61 index += 2; 62 } 63 return this.table[pos][index+1]; 64 } 65 return undefined; 66 } 67 function buildChains(){ 68 for(var i=0;i<this.table.length;i++){ 69 this.table[i] = new Array(); 70 } 71 } 72 73 74 var obj = new HashTable(); 75 obj.buildChains(); 76 obj.put("k1","zhangsan"); 77 obj.put("k2","lisi"); 78 obj.put("k3","javascript"); 79 obj.showDistro(); 80 console.log(obj.get("k2")); 81 </script> 82 </body> 83 </html>