js實現 hashMap
var hash_map = function () {var hash_table_length = 1024 * 1024; //2的冪次方 var hash_table = new Array(hash_table_length); //hashTable表 var total_size = 0; //總長度 /* * 新增hashmap值 * 參數: * key : key值 * value: 原始Value值 */ this.put = function (key, value) { if (key != null) { var hash = hashCode(key); //進過hashCode,將key轉化成整型 var index = indexFor(hash, hash_table.length); //從沖突鏈表中查詢KEY鍵是否存在,存在的話覆蓋新值 for (var obj = hash_table[index]; obj != null; obj = obj.next) { if (obj.hash == hash && obj.key == key) { obj.value = value; return obj.value; } } addEntry(hash, key, value, index); } return false; } /* * 獲取hashmap對應值 * 參數: * key : key值 */ this.get = function (key) { if (key != null) { var hash = hashCode(key); //進過hashCode,將key轉化成整型 var index = indexFor(hash, hash_table.length); for (var obj = hash_table[index]; obj != null; obj = obj.next) { if (obj.hash == hash && obj.key == key) { return obj.value; } } } return false; } /* * 刪除一個hash值 * 參數: * key : key值 */ this.remove = function (key) { if (key != null) { var hash = hashCode(key); //進過hashCode,將key轉化成整型 var index = indexFor(hash, hash_table.length); var entry = hash_table[index]; var e = entry; while (e != null) { //循環跑鏈表,將需要刪除值的next對象放到前一個對象的next中 var next = e.next; if (e.hash == hash && e.key == key) { if (entry == e) { hash_table[index] = next; } else { entry.next = next; } total_size--; return true; } entry = e; e = next; } } return false; } /* * 清空hashtable操作 * 參數: * key : key值 */ this.clear = function () { hash_table = null; hash_table = new Array(hash_table_length); total_size = 0; return hash_table; } /* * 判斷KEY值是否存在 * 參數: * key : key值 */ this.isSet = function (key) { if (key != null) { var hash = hashCode(key); //進過hashCode,將key轉化成整型 var index = indexFor(hash, hash_table.length); for (var obj = hash_table[index]; obj != null; obj = obj.next) { if (obj.hash == hash && obj.key == key) { return true; } } } return false; } /* * 返回hashMap長度 */ this.size = function () { return total_size; } /* * 解決hash沖突的鏈表結構 * 參數: * hash : hash值,key經過hashCode的值 * key : key值 * value: 原始Value值 * index: hashTable 索引值 */ var addEntry = function (hash, key, value, index) { var entry = hash_table[index]; var item = { "hash" : hash, "key" : key, "value" : value, "next" : entry }; hash_table[index] = item; total_size++; //統計數據表總長度 } /* * 經過該函數得到 哈希表 哈希地址 */ var indexFor = function (hash, length) { return hash & (length - 1); } /* * 通過hashCode函數,將key轉化成整型 */ var hashCode = function (key) { var h = 0, off = 0; var length = key.length; for (var i = 0; i < length; i++) { var temp = key.charCodeAt(off++); h = 31 * h + temp; if (h > 0x7fffffff || h < 0x80000000) { h = h & 0xffffffff; } } h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); }; } </pre><li>未實現自動擴容,初始化的時候,hashTable設置大點就行了,自動擴容可能會有很大效率問題</li>
本文由用戶 ptjs 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!