js实现 hashMap
已有 354 次阅读 2012-09-27 17:03
标签:
?
001 | var hash_map = function () { |
003 | var hash_table_length = 1024 * 1024; //2的幂次方 |
004 | var hash_table = new Array(hash_table_length); //hashTable表 |
005 | var total_size = 0; //总长度 |
013 | this .put = function (key, value) { |
015 | var hash = hashCode(key); //进过hashCode,将key转化成整型 |
016 | var index = indexFor(hash, hash_table.length); |
017 | //从冲突链表中查询KEY键是否存在,存在的话覆盖新值 |
018 | for ( var obj = hash_table[index]; obj != null ; obj = obj.next) { |
019 | if (obj.hash == hash && obj.key == key) { |
024 | addEntry(hash, key, value, index); |
034 | this .get = function (key) { |
036 | var hash = hashCode(key); //进过hashCode,将key转化成整型 |
037 | var index = indexFor(hash, hash_table.length); |
038 | for ( var obj = hash_table[index]; obj != null ; obj = obj.next) { |
039 | if (obj.hash == hash && obj.key == key) { |
052 | this .remove = function (key) { |
054 | var hash = hashCode(key); //进过hashCode,将key转化成整型 |
055 | var index = indexFor(hash, hash_table.length); |
056 | var entry = hash_table[index]; |
058 | while (e != null ) { //循环跑链表,将需要删除值的next对象放到前一个对象的next中 |
060 | if (e.hash == hash && e.key == key) { |
062 | hash_table[index] = next; |
081 | this .clear = function () { |
083 | hash_table = new Array(hash_table_length); |
093 | this .isSet = function (key) { |
095 | var hash = hashCode(key); //进过hashCode,将key转化成整型 |
096 | var index = indexFor(hash, hash_table.length); |
097 | for ( var obj = hash_table[index]; obj != null ; obj = obj.next) { |
098 | if (obj.hash == hash && obj.key == key) { |
109 | this .size = function () { |
116 | * hash : hash值,key经过hashCode的值 |
119 | * index: hashTable 索引值 |
121 | var addEntry = function (hash, key, value, index) { |
122 | var entry = hash_table[index]; |
129 | hash_table[index] = item; |
130 | total_size++; //统计数据表总长度 |
136 | var indexFor = function (hash, length) { |
137 | return hash & (length - 1); |
141 | * 通过hashCode函数,将key转化成整型 |
143 | var hashCode = function (key) { |
145 | var length = key.length; |
146 | for ( var i = 0; i < length; i++) { |
147 | var temp = key.charCodeAt(off++); |
149 | if (h > 0x7fffffff || h < 0x80000000) { |
153 | h ^= (h >>> 20) ^ (h >>> 12); |
154 | return h ^ (h >>> 7) ^ (h >>> 4); |
未实现自动扩容,初始化的时候,hashTable设置大点就行了,自动扩容可能会有很大效率问题
通过对key值进行hash成一个整型,并且作&与操作,将key值hash到hashTable数组中的一个值中
对于hash出来的值冲突的情况,实现了链表结构
主要参照java hashMap实现
思考:如果更复杂的hashMap,可以实现hashTable表多维数组的hash
hashTable的length越长,hash冲突越少
|